1. 寫個簡單的 libtest.so
test.hextern "C" { int Add(int num); }test.cpp
int Add(int num) { return num+1; }
Android.mk
include $(CLEAR_VARS) LOCAL_MODULE := littest LOCAL_SRC_FILES := test.cpp include $(BUILD_SHARED_LIBRARY)
2. 將已經 compile 好的 libtest.so 放進新的 project 裡
首先,要先把已經 build 好的 shared library 放到 Android 專案目錄裡而且必須根據平台區分才行:好比 armeabi, armeabi-v7a, x86, mips ,放好各平台 compile 好的 shared library 後,在 Android.mk 裡必須加一段指令,NDK 才會將這個 shared library 包進 .apk 裡
比如,我想要使用 libtest.so ,將各平台 compile 好的 .so 檔放至 mylib 底下
- mylib (folder示意)
- armeabi
- libtest.so
- aremabi-v7a
- libtest.so
- x86
- libtest.so
- mips
- libtest.so
就可以利用 NDK 的變數 $(TARGET_ARCH_ABI) 來區分不同平台的目錄
Android.mk
include $(CLEAR_VARS) LOCAL_MODULE := libtest LOCAL_SRC_FILES := ./mylib/$(TARGET_ARCH_ABI)/libtest.so include $(PREBUILT_SHARED_LIBRARY)
Build完後,確認一下 Android 專案下的目錄 $PROJECT\lib\<abi>\,照理來說應該會找到 libtest.so
3. 使用 dlopen 控制 libtest.so
typedef int (*fnAdd)(int); void* hDll = dlopen("/data/data/<package-name>/lib/libtest.so"); if(hDll) { fnAdd add = (fnAdd) dlsym(hDll, "Add"); if(fnAdd){ printf("10+1=%d\n", fnAdd(10)); } }
透過 Eclipse 將 .apk 安裝到手機上後,.so 將會放在 /data/data/<package_name>/libtest.so,這個 package_name 是定義在 AndroidManifest.xml 裡面的。
- TARGET_ARCH_ABI : NDK docs/ANDROID-MK.html
2 則留言:
在 "3. 使用 dlopen 控制 libtest.so" 中
程式的第 5~7 行應該為
if(add){
printf("10+1=%d\n", (*add)(10));
}
不知道是我觀念有誤還是您筆誤?
http://www.cprogramming.com/tutorial/function-pointers.html
應該是都可以的 :)
張貼留言