CMakeLists.txt设置:
cmake_minimum_required(VERSION 3.18.1) //声明cmake的版本号
add_library(nijian SHARED native-lib.cpp) //设置cmake执行时动态编译的参数,三个参数分别代表jni类库名字、是否可以作为共享库、编译执行的cpp文件名称
cpp文件设置:
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_getFromJni(JNIEnv* env, jobject /* this */) {
std::string hello = "i am jni call!!!";
return env->NewStringUTF(hello.c_str());
}
我们写的cpp文件的函数名需要对应包名+类名+方法名,必须要一一对应
build.gradle设置:
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.18.1'
}
}
在android{}闭包下添加如上设置,等项目gradle构建的时候就会执行我们的CMakeLists.txt文件
调用示例:
static {
System.loadLibrary("nijian");
}
public native String getFromJni();
首先需要load gradle编译生成的so库,so库的名字在CMakeLists.txt中定义,必须要一一对应
我们在类里面定义的native方法,可以看到在cpp文件中的实现也是一一对应的
自动生成so文件:
生成的so文件路径:app/build/intermediates/cmake/debug/obj/....
程序运行的时候调用的native方法,就是从so库里面读取的
调用流程说明:
-
gradle执行构建,执行CMakeLists.txt文件
-
编译我们定义的cpp文件,生成so库
-
安卓中调用cpp的代码,其实就是读取so库,实现jni调用