我在所遵循的教程中做了2种不同的实现,我注意到每个参数都有一点不同,其中1个参数是jclass
,另一个是jobject
,我在这里没有使用这些参数全部,但是我尝试将它们从jclass
切换到jobject
,然后从jobject
切换到jclass
,但我发现一切仍然按预期进行,因此我不确定{ {1}}和jobject
的功能完全一样,如果我的方法未使用这些参数中的任何一个,为什么也需要它们?有人可以在我的java类中提供这些方法的正确声明吗?我不确定我做对了吗
jinstance
答案 0 :(得分:2)
通常
jclass
,则此JNI函数对应于Java端类方法(用和声明为静态”)。 jclass
是对当前类的引用。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 6和this link goes to documentation of jni in java 8 almost the same.