JNI中的“jobject this”是什么,它用于什么?

我很难find答案。 但是,在JNI函数调用中使用的“jobject this”是什么? 例如:

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject this ) { 

我使用env经常分配对象,但我从来没有使用过,我不知道它是什么。 仅用于知识目的。

Solutions Collecting From Web of "JNI中的“jobject this”是什么,它用于什么?"

下面是一个JNI包装函数,它有两个参数,并返回一个基本的对象数组:

 jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ); 

从你给出的函数名称我不认为它是完整的,也就是说,你没有尊重的强制性函数名称约定是:

  1. 用Java_启动函数

  2. 附加由_(不需要内容)(即com_company_awesomeapp)分隔的软件包名称。 到目前为止,函数名称由以下部分组成:Java_com_company_awesomeapp

  3. 附加已经定义了本地方法的Java类名称,后跟实际的函数名称。 所以在这一点上,我们应该有以下函数名称: Java_com_company_awesomeapp_MainActivity_Test

第一个参数是指向一个存储所有JNI函数指针的结构的指针,也就是你在#include <jni.h>之后所有可用的预定义函数 。

第二个参数是对在其中声明了本地方法的Java对象的引用。 您可以使用它从当前的JNI函数调用Java 对象的其他方法 ,即从用C编写的JNI代码调用Java实例方法或C ++。

例如,如果在MainActivity.java文件中有以下Java类:

 public class MainActivity extends Activity { static { try { System.loadLibrary("mynativelib"); } catch (UnsatisfiedLinkError ule) { Log.e(TAG, "WARNING: Could not load native library: " + ule.getMessage()); } } public static native Object[] Test(); } 

然后,JNI函数的jobject thiz参数将是对MainActivitytypes的对象的引用。

我发现这个链接应该有助于澄清问题。

https://library.vuforia.com/articles/Solution/How-To-Communicate-Between-Java-and-C-using-the-JNI

这里是一个使用“jobject”的例子。

 JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_initApplicationNative( JNIEnv* env, jobject obj, jint width, jint height) { ... jclass activityClass = env->GetObjectClass(obj); jmethodID getTextureCountMethodID = env->GetMethodID(activityClass, "getTextureCount", "()I"); if (getTextureCountMethodID == 0) { LOG("Function getTextureCount() not found."); return; } textureCount = env->CallIntMethod(obj, getTextureCountMethodID); ... } 

jobject thiz在java类jobject thiz表示this

有时候,如果你创build一个像这样的static native方法。

 void Java_MyClass_method1 (JNIEnv *, jclass); 

jclass意味着类本身。