安裝NDK和CMake
- 打開AS的
Prefrences
—>Android SDK
—>SDK Tools
-
選中 NDK (Side by side) 和 CMake 複選框。我這裏之前在
nkd-bundle
中已經安裝NDK就沒有卸載了注意:如果您在
ndk-bundle
文件夾中安裝了 NDK,它會顯示在標籤爲 NDK 的列表中。如果您使用的是 Android Gradle 插件 3.5.0 或更高版本,則可以選中或取消選中該複選框。取消選中該複選框會卸載 NDK,釋放磁盤空間,並使該複選框從列表中消失。如果您卸載舊版 NDK,請從項目的local.properties
文件中移除ndk.dir
值,該值現已棄用。
- 打開項目結構
Project Structure
—>SDK Location
- 配置Android NDK路徑
新建NDK項目
新建項目,選擇Native C++
,
選擇默認的C++庫即可
點擊完成,初始化項目,構建結束會在src目錄下生成一個cpp目錄,內部包含一個c++源文件native-lib.cpp
和一個CMake配置文件CMakeLists.txt
build.gradle配置
- abiFiltes:設置生成的
.so
庫所支持的CPU結構
代碼實現
接下來逐個看下這兩個文件內容
-
native-lib.cpp
c++源文件,內部實現了Java層聲明
Native
方法先看下java層聲明的Native方法
與其對應的c++實現文件
其中c++源文件中對應函數命名規則爲:
Java_應用包名_類名_方法名(JNIEnv *env,jobject thiz)
注意:包名中的
.
需要替換爲_
-
CMakeLists.txt
編譯構建
上面代碼是我們創建一個NDK項目系統生成的樣例,如果我們需要自己實現NDK業務,步驟如下:
- Java層聲明Native方法
- 生成對應的C++方法並實現業務邏輯
- 配置
CMakeLists.txt
構建腳本 - 編譯構建
經過上述步驟,會默認在app->build->intermediates->cmake->debug/release->obj
目錄下生成所支持的不同CPU架構的的動態庫(.so
),在我們打包時候會一併打包到APK中。
ps:當然我們也可以指定動態庫的生成路徑。例如,將構建的so動態庫文件存儲在應用項目app->jniLibs
目錄下:在CMakeLists.txt
構建腳本中我們指定如下腳本():
如何使用
自身項目使用
所謂自身項目使用:即在當前項目內通過Java層聲明Native方法,並且在當前項目中通過C/C++實現Native方法,然後通過CMake編譯生成so動態庫後在當前項目內直接使用,如下:
在需要調用Native的業務處通過static{System.loadLibrary("name");}
加載動態庫,然後直接調用Native方法即可
其他項目使用
相對於自身使用,還有一種方式就是將A項目通過CMake編譯後的so動態庫文件提供給B(其他)項目使用,具體步驟如下:
-
A項目
-
Java層聲明native方法
-
生成對應c/c++源文件並實現
-
配置
CMakeLists.txt
腳本文件並編譯生成so動態庫
-
將生成的so動態度copy給B(其他)項目
-
-
B項目
-
將A項目提供的so動態庫文件放在項目的
jniLibs
目錄下,或者libs目錄下所支持對應的cpu架構目錄下(必須在build.gradle中重定向jniLibs.srcDirs=['libs']
),並配置應用所支持的CPU架構(需要依據提供方給到所支持的so動態庫來配置)
-
聲明native方法(native方法的包名與類名必須與提供方一致,可讓提供方連同so動態庫一起提供)
-
在項目中使用
配置完成後,在項目需要使用的地方,通過如下代碼加載動態庫後即可使用
-
更多閱讀
-
《NDK 入門指南》