NDK裏有個例子: android-ndk-r10/samples/module-exports/jni
一看就懂了android
———————————————————————————–架構
從r5版本開始,就支持預編譯的庫(共享和靜態). 也就是說在你的應用中,可包含和使用 預先編譯的庫。函數
這個功能的用處
1. 你想分發你本身的庫給第3方 NDK開發者,但不想把源碼給他們
2. 你想使用本身的預編譯的庫 來加速項目的Build過程。ui
聲明一個預編譯的庫模塊
每一個預編譯的庫,都必須聲明爲一個獨立的模塊 給ndk build系統。ip
目錄結構開發
mylib --Android.mk --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)
注意事項
1. 每一個預編譯的模塊都必須有一個名字, 好比上面取的名字是 foo-prebuilt
模塊 名字 能夠跟 預編譯的庫的名字 不同(好比庫的名字是 libfoo, 模塊的名字是 foo-prebuild)
2. 設置 LOCAL_SRC_FILES 爲你提供的預編譯庫的 路徑。注意,這個路徑 是相對於 LOCAL_PATH的。 聽說也在 LOCAL_PATH/lib 目錄裏找源so.源碼
另外: 若是你提供的庫有多個ABI的版本,還要有點技巧,後面會提到。編譯
3. 包含 PREBUILT_SHARED_LIBRARY (提供共享庫) ; 或者 包含 PREBUILT_STATIC_LIBRARY(提供靜態庫)class
在其餘模塊中 引用上面準備好的預編譯模塊
只需添加LOCAL_SHARED_LIBRARIES(或者 LOCAL_STATIC_LIBRARIES)聲明 到你的 Android.mk中就好了
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := foo-user LOCAL_SRC_FILES := foo-user.c LOCAL_SHARED_LIBRARIES := foo-prebuilt #LOCAL_LDLIBS := -lm -llog include $(BUILD_EXECUTABLE)
惟一要注意的是,引用 模塊名(foo-prebuilt), 而不是庫名(libfoo)
爲預編譯的庫 輸出頭文件
在實際應用中, foo-user.c會依賴於 同庫文件一塊兒分發的頭文件(foo.h)中聲明的函數或變量
也就是說,在 foo-user.c 將會有以下代碼
#include <foo.h>
構建你的foo-user模塊時,必須提供 預編譯模塊的 頭文件 以及 頭文件的包含路徑 給編譯器。
假設頭文件愛你 放在 預編譯模塊目錄下的 include 目錄, 咱們能夠在預編譯模塊的Android.mk中使用export
LOCAL_PATH := $(call my-dir) 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 能夠讓 別的引用模塊 找到 適合的頭文件
別的引用模塊,將在 本身的 Android.mk裏用 LOCAL_C_INCLUDE 來找(好像不用聲明這個, LOCAL_LDFLAGS也不用)
多種ABI
armeabi 目標CPU是ARM v5 TE或者以後的架構 armeabi-v7a 目標CPU是 ARM v7或者以後的架構 x86 mips
須要修改 預編譯模塊裏定義的 LOCAL_SRC_FILES
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so