C ++ NDK中的“ jobject”和“ jclass”有什么区别

时间:2019-05-21 03:00:15

标签: java c++ android-ndk ndk-build

我在所遵循的教程中做了2种不同的实现,我注意到每个参数都有一点不同,其中1个参数是jclass,另一个是jobject,我在这里没有使用这些参数全部,但是我尝试将它们从jclass切换到jobject,然后从jobject切换到jclass,但我发现一切仍然按预期进行,因此我不确定{ {1}}和jobject的功能完全一样,如果我的方法未使用这些参数中的任何一个,为什么也需要它们?有人可以在我的java类中提供这些方法的正确声明吗?我不确定我做对了吗

jinstance

2 个答案:

答案 0 :(得分:2)

通常

  • 如果JNI函数参数具有jclass,则此JNI函数对应于Java端类方法(用声明为静态”)。 jclass是对当前类的引用。
  • 如果JNI函数参数具有jobject,则此JNI函数对应于Java端 instance方法(声明为 without 而没有静态”)。 jobject是对当前实例的引用。

具体地说,

JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_pauseSounds(JNIEnv* env, jclass thiz);

对应于Java方面的 static 本地方法( class方法),即

package org.cocos2dx.cpp

class AppActivity{
    public static native void pauseSounds();
}

低于JNI方法

JNIEXPORT jstring JNICALL Java_org_cocos2dx_cpp_AppActivity_score(JNIEnv *env, jobject instance);

对应于Java端的本地方法( instance方法),即

package org.cocos2dx.cpp

class AppActivity{
   public native String score();
}
  

如果我的方法未使用这两个参数,为什么需要它们?

这些参数是自动生成的,并且在需要时将由JNI使用,例如,在需要回调Java端 class 方法的情况下,您需要执行以下操作({ 1}}是方法JNI签名):

()V"

如果您需要回调Java端 instance 方法,则需要以下内容(jmethodID staticMethod = env->GetStaticMethodID(clazz, "pauseSounds", "()V"); 是方法JNI签名):

()Ljava/lang/String;"

答案 1 :(得分:1)

在C中,所有其他JNI引用类型都定义为与jobject相同。例如:

typedef jobject jclass;

在C ++中,JNI引入了一组伪类来加强子类型关系。例如:

class _jobject {};
class _jclass : public _jobject {};

用法示例:

JNIEnv* env = ...;
// substitute your desired class's specifier for "java/lang/Class"...
jclass cls = env->FindClass("java/lang/Class"); 
jmethodID mid_getName = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
jstring name = env->CallObjectMethod(cls, mid_getName);

this link goes to oracle documentation of jni for java 6this link goes to documentation of jni in java 8 almost the same.