Administrator
Published on 2022-01-25 / 201 Visits
0

JNI 语法

https://www.jianshu.com/p/87ce6f565d37

基本概念

jni的写法指的是在cpp文件中写的,比如:
image.png

函数结构

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 调用中起着重要作用。

  1. JNIEnv* env:
  • JNIEnv 是一个指向 JNI 环境结构的指针,它包含了执行 JNI 调用的上下文信息。
  • 每个 Java 虚拟机实例都有一个 JNIEnv 对象,该对象在 JNI 调用时传递给 JNI 函数。
  • JNIEnv 对象提供了对 Java 对象、方法、字段等的访问能力,以及执行 Java 代码的能力。
  1. 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中类型的对应关系

image.png

回调JAVA函数方法

需要注意的是,有些要释放资源,不然此方法调用多了,jni会报错,什么512之类的。
image.png
使用上面代码,会少一些必要的对象,如图,这两个需要提前某个方法保存下来的:
image.png