https://www.jianshu.com/p/87ce6f565d37
基本概念
jni的写法指的是在cpp文件中写的,比如:
函数结构
JNIExport jstring JNICALL
Java_com_example_hellojni_MainActivity_stringFromJNI( JNIEnv* env,jobject thiz ){
}
JNIExport和JNICALL是不固定保留的关键字不要修改
jstring 是返回值类型 , jstring是java中的String类型,jint是java中的int类型
Java_com_example_hellojni 是包名
MainActivity 是类名
stringFromJNI 是方法名
JNIEnv是一个线程相关的结构体,是当前Java线程的执行环境,可以通过这个调用java函数,并不是直接调用,而是跟“ jstring是java中的String类型”类似,也有一一对应的函数名,可以看后面的说明。
JNIEnv*和jobject
在 Android 开发中,当您使用 CMake 编写 JNI 层的方法时,JNIEnv* env 和 jobject 是两个关键的参数,它们在 JNI 调用中起着重要作用。
- JNIEnv* env:
- JNIEnv 是一个指向 JNI 环境结构的指针,它包含了执行 JNI 调用的上下文信息。
- 每个 Java 虚拟机实例都有一个 JNIEnv 对象,该对象在 JNI 调用时传递给 JNI 函数。
- JNIEnv 对象提供了对 Java 对象、方法、字段等的访问能力,以及执行 Java 代码的能力。
- jobject:
- jobject 是 Java 对象在 JNI 层的一个引用。
- 它是一个指针,指向 Java 虚拟机内部的数据结构,该数据结构包含了 Java 对象的元数据和引用计数等信息。
- 在 JNI 函数中,jobject 用于表示 Java 对象,并允许调用 Java 方法、访问 Java 字段等。
在 JNI 函数中,JNIEnv* env 和 jobject 通常作为第一个和第二个参数传递,例如:
JNIEXPORT jstring JNICALL Java_com_example_app_ExampleActivity_getStringFromNative(JNIEnv* env, jobject thiz) {
// 这里可以使用 env 和 thiz 来执行 Java 代码或操作 Java 对象
return (*env)->NewStringUTF(env, "Hello from native!");
}
在这个例子中,env 是指向 JNIEnv 结构的指针,而 thiz 是 ExampleActivity 类的对象引用。通过 env 和 thiz,您可以执行 Java 代码、调用 Java 方法、访问 Java 字段等。
jni中与java中类型的对应关系
回调JAVA函数方法
需要注意的是,有些要释放资源,不然此方法调用多了,jni会报错,什么512之类的。
使用上面代码,会少一些必要的对象,如图,这两个需要提前某个方法保存下来的: