15

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

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {

env经常分配对象,但我从未使用过 thiz,我不确定它的用途。仅出于知识目的。

4

3 回答 3

20

下面是一个 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>

第二个参数是对声明了该native方法的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参数将是对 MainActivity 类型对象的引用。

于 2013-01-29T09:13:16.150 回答
1

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

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);
    ...
}
于 2016-11-10T01:50:11.037 回答
0

jobject thiz表示thisin java 类。

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

void Java_MyClass_method1 (JNIEnv *, jclass);

jclass表示类本身。

于 2013-01-21T06:33:39.120 回答