使用CMake構建native代碼這一篇NDK開發(fā):使用CMake構建native代碼
第一步:
定義java 本地接口文件JNIUtils
public class JNIUtils {
//靜態(tài)代碼塊加載動態(tài)庫(moduleName)
static {
//字符串內(nèi)名字需要跟下文中Android.mk文件LOCAL_MODULE := my_jni,的my_jni一致.
System.loadLibrary("my_jni");
}
//native定義jni在方法
//這里簡單從native代碼中獲取字符串
public native String getStringFromJni();
}
}
第二步:(可選)
在app build.gradle defaultConfig中添加自己想支持的構架
ndk{
// 設置支持的 SO 庫構架
abiFilters "armeabi-v7a", "arm64-v8a"
}
第三步:
main目錄下創(chuàng)建jni目錄
image.png
在jni目錄下創(chuàng)建jni原文件jnitest.c
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_leory_ndkdemo_JNIUtils_getStringFromJni
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"This is Jni test!");
}
Java_com_leory_ndkdemo_JNIUtils是上面JNIUtils路徑,getStringFromJni對應的是方法名
這里簡單的返回一個字符串
在jni目錄下創(chuàng)建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_jni
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE是動態(tài)庫的名字
LOCAL_SRC_FILES是源文件名字
關聯(lián)gradle和ndk-build:app module下右鍵選擇
image.png
選擇ndk-build構建钝侠,然后選擇剛剛創(chuàng)建的Android.mk文件路徑
image.png
按ok確定后會自動在app build.grade 的android中生成下面代碼(當然也可以手動添加)该园,并編譯
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
生成的對就應的so文件在build->intermediates->ndkBuild下
image.png
第四步:
在代碼中調(diào)用
image.png
頁面顯示成功
image.png
第五步:(可選)
完成上面一上就已經(jīng)成功了,不過每次都會調(diào)用了ndkBuild生成so文件帅韧,所以如果我們不經(jīng)常改jni源代碼里初,我們可以直接使用生成的so文件。
我們把生成的so文件復制到libs目錄下(沒有l(wèi)ibs目錄就新建一個)
image.png
然后在build.gradle android 中指定jniLibs的目錄
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
接著把上面ndk-build構建的代碼注釋掉(需要重新編譯的時候再打開)忽舟,不然又會生成so文件與libs目錄so文件沖突
// externalNativeBuild {
// ndkBuild {
// path file('src/main/jni/Android.mk')
// }
// }