最近項目中需要調用c/c++的實現,Android是支持JNI的,所以體驗了一下JNI的全過程
1. 前期環境准備
(1) 下載NDK,國內用戶需要翻牆。
目前官網上mac版最新的是android-ndk-r10e-darwin-x86_64.bin, 文件比較大,300多M。
下載下來後,解壓到相應目錄,備用。解壓命令如下:
ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk$ ./android-ndk-r10c-darwin-x86_64.bin
解壓後在原目錄會生成一個新的文件夾(android-ndk-r10e), 裡面即是NDK的各種工具。
windows系統應該是可以直接用7zip或者zip工具解壓,生成一個包含NDK環境的文件夾。 都比較簡單。
(2) 設置NDK環境變量
跳轉到用戶目錄下,打開.bash_profile文件
cd ~
touch .bash_profile
open -e .bash_profile
添加如下:
export NDK_ROOT=/Users/your_account/.../android-ndk-r10e
source .bash_profile
然後重啟terminal, 輸入ndk-build, 應該會輸出一大堆的信息。
類似下面的信息:
MacBook-Pro:~$ndk-build
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/Users/xxxxx/android-ndk-r10e/build/core/build-local.mk:143: *** Android NDK: Aborting . Stop.
這樣前期的環境准備就完成了。
2. JNI的編寫
這是官網上一篇介紹JNI的文章, http://developer.android.com/training/articles/perf-jni.html。 裡面有提到如何調用JNI的方法,
以及如何在JNI中訪問java的對象或者方法或者屬性。 這裡就不詳細介紹了。
在Android Studio中,在響應的java代碼的地方寫好native的方法。
接著就是要生成c的頭文件,需要用到javah命令,首先cd到source文件夾目錄下,android studio中的目錄是src/main/java
調用javah生成頭文件,調用方法如下:
javah -classpath /Users/....../sdk/platforms/android-21/android.jar:. -d jni com.test.native.nativeUtils
執行完沒有問題的話,會在同目錄生成jni文件夾,裡面包含了生成的c的頭文件。
需要注意的兩點, classpath的最後有:., 第二點是java的class名稱,用.替代目錄分隔符。
3. 編寫JNI程序,這個沒啥說的,就是c或者c++程序。
4. 編寫Android.mk和Application.mk
同樣的,android官網提供了很多的幫助性文檔
https://developer.android.com/ndk/guides/android_mk.html
https://developer.android.com/ndk/samples/sample_na.html#apm
簡略如下:
生成的so的名字,同樣也是在java中loadlibrary中的名字。
LOCAL_SRC_FILES 指定了編譯的源代碼的文件名,可以指定多個
LOCAL_MODULE := native-test
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
然後編寫Application.mk, 指定最小支持的api level等屬性
APP_ABI := all
APP_PLATFORM:= android-21
APP_OPTIM := release
5. 生成so文件
最後ndk-build命令,會生成各種格式的so文件, 大功告成。
6. 在java程序中加載生成的so文件。
static {
loadLibrary(native-test);
}