使用預建程式庫

NDK 支援使用預建程式庫 (同時支援靜態程式庫和共用程式庫),這項功能有兩個主要用途:

  • 向第三方 NDK 開發人員發布您自己的程式庫,無需發布來源。
  • 使用您自己程式庫的預建版本加快建構速度。

本頁說明了如何使用預建程式庫。

宣告預建程式庫

您必須將自己使用的每個預建程式庫宣告為一個獨立模組。如要宣告,請按照下列步驟進行:

  1. 命名模組。這個名稱不必與預建程式庫名稱相同。
  2. 在模組的 Android.mk 檔案中,將指向您提供的預建程式庫的路徑指派給 LOCAL_SRC_FILES。指定 LOCAL_PATH 變數值的相對路徑。

  3. 根據您使用的是共用程式庫 (.so) 或靜態程式庫 (.a) 而定,加入 PREBUILT_SHARED_LIBRARYPREBUILT_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_LIBRARIESLOCAL_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 目錄中的版本。