NDK 支援使用預建程式庫 (同時支援靜態程式庫和共用程式庫),這項功能有兩個主要用途:
- 向第三方 NDK 開發人員發布您自己的程式庫,無需發布來源。
- 使用您自己程式庫的預建版本加快建構速度。
本頁說明了如何使用預建程式庫。
宣告預建程式庫
您必須將自己使用的每個預建程式庫宣告為一個獨立模組。如要宣告,請按照下列步驟進行:
- 命名模組。這個名稱不必與預建程式庫名稱相同。
在模組的 Android.mk 檔案中,將指向您提供的預建程式庫的路徑指派給
LOCAL_SRC_FILES
。指定LOCAL_PATH
變數值的相對路徑。根據您使用的是共用程式庫 (
.so
) 或靜態程式庫 (.a
) 而定,加入PREBUILT_SHARED_LIBRARY
或PREBUILT_STATIC_LIBRARY
。
下面這個簡單的範是假設預建程式庫 libfoo.so
與描述它的 Android.mk 檔案位於同一個目錄中。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
在這個範例中,模組名稱與預建程式庫名稱相同。
建構系統會將一份預建共用程式庫副本放入 $PROJECT/obj/local
,然後將另一份擷取的偵錯資訊副本放入 $PROJECT/libs/<abi>
。此處的 $PROJECT
是專案的根目錄。
從其他模組參照預建程式庫
如要從其他模組參照預建程式庫,請在與這些模組相關聯的 Android.mk 檔案中,將預建程式庫的名稱指定為 LOCAL_STATIC_LIBRARIES
或 LOCAL_SHARED_LIBRARIES
變數值。
例如,使用 libfoo.so
的模組說明可能如下所示:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
此處的 LOCAL_MODULE
是參照預建程式庫的模組名稱,而 LOCAL_SHARED_LIBRARIES
是預建程式庫的名稱。
匯出預建程式庫的標頭
foo-user.c
中的程式碼取決於通常包含在隨預建程式庫發布的標頭檔案 (例如 foo.h
) 中的特定宣告。例如,foo-user.c
中可能會有類似以下內容的一行程式碼:
#include <foo.h>
在這種情況下,您需要在建構 foo-user
模組時提供標頭,及其指向編譯器的 include 路徑。如要完成這項工作,有個簡單的做法是在預建模組定義中使用匯出值。例如,只要標頭 foo.h
位於與預建模組相關聯的 include
目錄下,您就可以按照以下方式對其進行宣告:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
此處的 LOCAL_EXPORT_C_INCLUDES
定義可確保建構系統匯出指向預建程式庫 include
目錄的路徑,並針對依賴預建程式庫的模組將這個路徑附加到 LOCAL_C_INCLUDES
值的開頭。
這項作業可讓建構系統找出必要的標頭。
偵錯預建程式庫
建議您提供含有偵錯符號的預建共用程式庫。NDK 建構系統總會從其安裝到 $PROJECT/libs/<abi>/
的對應程式庫版本中移除這些符號,但您可以使用偵錯版本透過 ndk-gdb
進行偵錯。
為預建程式庫選取 ABI
請務必為目標 ABI 選取正確版本的預建共用程式庫。Android.mk 檔案中的 TARGET_ARCH_ABI
變數可以將建構系統指向適當版本的程式庫。
例如,假設您的專案包含兩個版本的程式庫 libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
下列程式碼片段說明了如何使用 TARGET_ARCH_ABI
,以便建構系統選取適當版本的程式庫:
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)
如果您已將 armeabi
指定為 TARGET_ARCH_ABI
的值,建構系統便會使用 armeabi
目錄中的 libfoo.so
版本。如果您已將 x86
指定為 TARGET_ARCH_ABI
的值,建構系統便會使用 x86
目錄中的版本。