使用CMake构建native代码这一篇NDK开发:使用CMake构建native代码
第一步:
定义java 本地接口文件JNIUtils
public class JNIUtils {
//静态代码块加载动态库(moduleName)
static {
//字符串内名字需要跟下文中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目录下创建jni目录
在jni目录下创建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目录下创建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是动态库的名字
LOCAL_SRC_FILES是源文件名字
关联gradle和ndk-build:app module下右键选择
选择ndk-build构建,然后选择刚刚创建的Android.mk文件路径
按ok确定后会自动在app build.grade 的android中生成下面代码(当然也可以手动添加),并编译
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
生成的对就应的so文件在build->intermediates->ndkBuild下
第四步:
在代码中调用
页面显示成功
第五步:(可选)
完成上面一上就已经成功了,不过每次都会调用了ndkBuild生成so文件,所以如果我们不经常改jni源代码,我们可以直接使用生成的so文件。
我们把生成的so文件复制到libs目录下(没有libs目录就新建一个)
然后在build.gradle android 中指定jniLibs的目录
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
接着把上面ndk-build构建的代码注释掉(需要重新编译的时候再打开),不然又会生成so文件与libs目录so文件冲突
// externalNativeBuild {
// ndkBuild {
// path file('src/main/jni/Android.mk')
// }
// }