什么是JNI中的"jobject thiz",它用于什么?

gny*_*his 13 java-native-interface android android-ndk

我很难找到答案.但是,用于JNI函数调用的"jboject thiz"是什么?例如:

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {
Run Code Online (Sandbox Code Playgroud)

env常常用来分配对象,但是我从来没有使用过thiz而且我不确定它是什么用的.仅出于知识目的.

bit*_*tek 18

以下是一个JNI包装函数,它有两个参数,并返回一个原始对象数组:

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz );
Run Code Online (Sandbox Code Playgroud)

从您给出的函数名称我认为它不完整,也就是说,您没有遵守强制函数名称约定,即:

  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();
}
Run Code Online (Sandbox Code Playgroud)

然后,JNI函数的jobject thiz参数将是对MainActivity类型的对象的引用.