前期準備:
1、AndroidStudio版本 升級到2.2或者以上
2、下載ndk和cmake
可以在AS打開SDK manager里勾選NDK和CMake。另外建議也勾了LLDB,這是用于C++代碼debug用的
另外ndk下載慢的話,也可以到這里 下載離線包,在新建完項目后手動配置過去
一、前期東西好后,可以開始新建項目(注意勾選Include C++ Support。這樣AS會自動添加對C++的支持,否則在后面要手動改gradle腳本才能支持)。后面正常配置到finish就行。
要是前期準備下載ndk離線包的,可以在這里指定好ndk的路徑
構建好的項目后,目錄如下:
cpp目錄跟以前的jni目錄對應,用于存放C++的代碼
CMakeLists.txt文件和以前的Android.mk和Application.mk對應,都是用于指定編譯配置的
再看app級別的build.gradle:
新建好項目后,AS會自動生成了個JNI調用的例子
點擊Make project或者直接運行app:
然后就會
1.Gradle調用外部的編譯腳本CMakeLists.txt
2.CMake執行編譯腳本CMakeLists.txt中的命令,將C++源文件(native-lib.cpp)編譯成共享對象庫(libnative-lib.so),Gradle再將這個so庫打包到APK中。
生成的so庫在如下目錄里面
點擊AS的菜單Build->Analyze apk,選擇之前生成的akp,可以看見so包含在apk里面了
二、配置的大概就如上,開始編寫自己的java調用native的方法
因為AS發現java方法沒有C++實現,就報紅,此時可以如下:
AS會自動在native-lib.cpp里面生成好方法的模板,自己在里面實現具體邏輯就行。然后在MainActivity里面調用就行。
插曲:修改后代碼如下,這時候直接運行會報java.lang.UnsatisfiedLinkError: Native method not found錯誤。
注意系統自動生成方法的時候沒有extern"C",需要自己加上,這里去掉注釋就好。這是因為C和C++的符號表不相同造成的。jni是按照C的生成規則去找函數的, 所以在函數聲明的時候要加上extern C使編譯器把函數按照C的規則編譯 這樣才能被Java調用。