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

时间:2013-01-20 20:53:45

标签: android android-ndk java-native-interface

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

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {

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

3 个答案:

答案 0 :(得分:18)

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

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz );

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

  1. 使用Java _

  2. 启动该功能
  3. 附加由_(不包括)分隔的包名称,即com_company_awesomeapp。到目前为止,函数名称由以下组成:Java_com_company_awesomeapp

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

  5. 第一个参数是指向存储所有JNI函数指针的结构的指针,即#include <jni.h>之后的所有the predefined functions you have available

    第二个参数是对Java对象的引用,在该对象中声明了这个本机方法。 You can use it to call the other methods of the Java object来自当前的JNI函数,即从JNI代码中调用Java实例方法在C或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类型的对象的引用。

答案 1 :(得分: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);
    ...
}

答案 2 :(得分:0)

jobject thiz表示java类中的this

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

void Java_MyClass_method1 (JNIEnv *, jclass);

jclass表示班级本身。