使用ndk-build构建native代码看这一篇NDK开发:使用ndk-build构建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目录(也有些人创建cpp目录,不过都可以,不影响)
image.png
在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目录下创建 CMake 构建脚本CMakeLists.txt(相当于ndk-build构建的Android.mk)
${CMAKE_SOURCE_DIR}代表是CMakeLists.txt所在的目录,也可以去掉
# 设置Cmake最小版本
cmake_minimum_required(VERSION 3.4.1)
# 编译library
# 设置Cmake最小版本
cmake_minimum_required(VERSION 3.4.1)
# 编译library
add_library( # 设置library名称
my_jni
# 设置library模式
# SHARED模式会编译so文件,STATIC模式不会编译
SHARED
# 设置原生代码路径
${CMAKE_SOURCE_DIR}/jnitest.c )
关联gradle和CMake:app module下右键选择
image.png
选择CMake构建,然后选择刚刚创建的CMakeLists.txt文件路径
image.png
按ok确定后会自动在app build.grade 的android中生成下面代码(当然也可以手动添加),并编译
externalNativeBuild {
cmake {
path file('src/main/jni/CMakeLists.txt')
}
}
生成的对就应的so文件在build->intermediates->cmake下
image.png
第四步:
在代码中调用
image.png
页面显示成功
image.png
第五步:(可选)
完成上面一上就已经成功了,不过每次都会调用了cmake生成so文件,所以如果我们不经常改jni源代码,我们可以直接使用生成的so文件。
我们把生成的so文件复制到libs目录下(没有libs目录就新建一个)
image.png
然后在build.gradle android 中指定jniLibs的目录
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
接着把上面cmake构建的代码注释掉(需要重新编译的时候再打开),不然又会生成so文件与libs目录so文件冲突
// externalNativeBuild {
// cmake {
// path file('src/main/jni/CMakeLists.txt')
// }
// }