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 Anda gunakan 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 Anda.

  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 di 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 dari 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, misalnya foo.h, yang didistribusikan bersama library bawaan. Sebagai contoh, 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 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 memuat simbol debug. Sistem build NDK selalu menghilangkan simbol dari versi library yang diinstalnya ke $PROJECT/libs/<abi>/, tetapi Anda dapat menggunakan versi debug untuk menjalankan proses debug dengan ndk-gdb.

Memilih ABI untuk Library Bawaan

Anda harus memilih versi library bersama bawaan yang sesuai dengan ABI yang Anda targetkan. 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 sudah menentukan x86 sebagai nilai dari TARGET_ARCH_ABI, sistem build akan menggunakan versi tersebut dalam direktori x86.