NDK里有個例子: android-ndk-r10/samples/module-exports/jni
一看就懂了
———————————————————————————–
從r5版本開始,就支持預編譯的庫(共享和靜態). 也就是說在你的應用中,可包含和使用 預先編譯的庫。
這個功能的用處
1. 你想分發你自己的庫給第3方 NDK開發者,但不想把源碼給他們
2. 你想使用自己的預編譯的庫 來加速項目的Build過程。
聲明一個預編譯的庫模塊
每個預編譯的庫,都必須聲明為一個獨立的模塊 給ndk build系統。
目錄結構
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(提供靜態庫)
在其他模塊中 引用上面准備好的預編譯模塊
只需添加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