NDK mendukung penggunaan library bawaan, baik statis maupun bersama. Ada dua kasus penggunaan pokok untuk fungsi ini:
- Mendistribusikan library Anda sendiri ke developer NDK pihak ketiga tanpa mendistribusikan sumber Anda.
- Menggunakan versi bawaan library Anda sendiri untuk mempercepat proses build.
Halaman ini menjelaskan cara menggunakan library bawaan.
Mendeklarasikan library bawaan
Anda harus mendeklarasikan setiap library bawaan yang digunakan sebagai modul independen. Caranya, ikuti langkah-langkah berikut:
- Berikan nama untuk modul tersebut. Nama ini tidak harus sama dengan nama library bawaan itu sendiri.
Dalam file Android.mk modul, tetapkan jalur ke library bawaan yang Anda sediakan ke
LOCAL_SRC_FILES
. Tentukan jalur yang terkait dengan nilai variabelLOCAL_PATH
.Sertakan
PREBUILT_SHARED_LIBRARY
atauPREBUILT_STATIC_LIBRARY
, bergantung pada apakah Anda menggunakan library bersama (.so
) atau statis (.a
).
Berikut adalah contoh sederhana yang mengasumsikan library bawaan libfoo.so
berada
dalam direktori yang sama dengan file Android.mk yang mendeskripsikannya.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
Dalam contoh ini, nama modul sama dengan nama library bawaan.
Sistem build menempatkan salinan library bersama bawaan di $PROJECT/obj/local
dan salinan lainnya yang tidak menyertakan informasi debug di $PROJECT/libs/<abi>
. Di sini, $PROJECT
adalah direktori utama project Anda.
Mereferensikan library bawaan dari modul lain
Untuk mereferensikan library bawaan dari modul lain, tentukan namanya sebagai
nilai variabel LOCAL_STATIC_LIBRARIES
atau LOCAL_SHARED_LIBRARIES
dalam
file Android.mk yang terkait dengan modul lain tersebut.
Misalnya, deskripsi modul yang menggunakan libfoo.so
mungkin terlihat sebagai berikut:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
Di sini, LOCAL_MODULE
adalah nama modul yang mereferensikan library bawaan;
LOCAL_SHARED_LIBRARIES
adalah nama library bawaan itu sendiri.
Mengekspor header untuk library bawaan
Kode dalam foo-user.c
bergantung pada deklarasi spesifik yang biasanya berada
dalam file header, seperti foo.h
, yang didistribusikan bersama library bawaan. Misalnya, foo-user.c
mungkin memuat baris seperti berikut:
#include <foo.h>
Dalam kasus seperti itu, Anda perlu memberikan header dan jalur include-nya ke compiler saat Anda membuat modul foo-user
. Cara sederhana untuk melakukannya adalah dengan menggunakan ekspor dalam definisi modul bawaan. Misalnya, selama header foo.h
berada di direktori include
yang terkait dengan modul bawaan, Anda dapat mendeklarasikannya sebagai berikut:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Definisi LOCAL_EXPORT_C_INCLUDES
di sini memastikan bahwa sistem build mengekspor jalur ke direktori include
library bawaan, dengan menambahkan jalur tersebut sebagai awalan ke nilai LOCAL_C_INCLUDES
untuk modul yang bergantung padanya.
Operasi ini memungkinkan sistem build menemukan header yang diperlukan.
Men-debug library bawaan
Sebaiknya Anda menyediakan library bersama bawaan yang berisi simbol
debug. Sistem build NDK selalu menghilangkan simbol dari versi
library yang diinstalnya ke $PROJECT/libs/<abi>/
, tetapi Anda dapat menggunakan versi
debug untuk men-debug dengan ndk-gdb
.
Memilih ABI untuk library bawaan
Anda harus memilih versi library bersama bawaan yang tepat
untuk ABI yang ditargetkan. Variabel TARGET_ARCH_ABI
dalam file Android.mk dapat mengarahkan sistem build ke versi library yang sesuai.
Misalnya, anggaplah project Anda memuat dua versi library libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
Cuplikan berikut menunjukkan cara menggunakan TARGET_ARCH_ABI
agar sistem build memilih versi library yang sesuai:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Jika Anda telah menentukan armeabi
sebagai nilai dari TARGET_ARCH_ABI
, sistem build akan menggunakan versi libfoo.so
yang terletak di direktori armeabi
. Jika Anda telah menentukan x86
sebagai nilai dari TARGET_ARCH_ABI
, sistem build akan menggunakan versi yang ada di direktori x86
.