Menggunakan library bawaan

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:

  1. Berikan nama untuk modul tersebut. Nama ini tidak harus sama dengan nama library bawaan itu sendiri.
  2. Dalam file Android.mk modul, tetapkan jalur ke library bawaan yang Anda sediakan ke LOCAL_SRC_FILES. Tentukan jalur yang terkait dengan nilai variabel LOCAL_PATH.

  3. Sertakan PREBUILT_SHARED_LIBRARY atau PREBUILT_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.