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

17

我很难找到答案。但是,在JNI函数调用中,“jboject thiz”有什么用途?例如:

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {

我经常使用env来分配对象,但是我从未使用过thiz,也不确定它的用途。只是出于了解目的。


8
"this" 是一个关键字。"thiz" 是一个合法的变量名称,可用于表示关键字 "this" 所代表的对象。 - paulsm4
哦,所以 clazz 不是因为 Java 的某个重要部分是在德国建造的或者什么的... - i336_
3个回答

21
以下是一个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或C++编写的JNI代码中调用Java实例方法。

例如,如果您在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参数将是对类型为MainActivity的对象的引用。


你的示例代码有误,如果方法 Teststatic 的,则第二个参数 thiz 将是 jclass 类型(MainActivity 类),因此它不是指向 MainActivity 类型对象的引用。 - Khang .NT

2
我找到了一个链接,应该可以帮助澄清这个问题。

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);
    ...
}

0

jobject thiz 表示 Java 类中的 this

有时,如果您创建一个像这样的 static native 方法。

void Java_MyClass_method1 (JNIEnv *, jclass);

jclass 表示类本身。


那么,在你的例子中,它将是对MyClass实例的引用/句柄? - gnychis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接