Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI GetObjectClass始终返回java/lang/Class_Java_Android Ndk_Java Native Interface - Fatal编程技术网

JNI GetObjectClass始终返回java/lang/Class

JNI GetObjectClass始终返回java/lang/Class,java,android-ndk,java-native-interface,Java,Android Ndk,Java Native Interface,env->CallVoidMethod在使用时返回java/lang/Class env->GetObjectClass(aobject); //aobject was the argument sent by JNI to C++ AOObject是实现接口的Java对象 jobject obj = env->GetObjectClass(aobject) 应该返回Java对象,但返回的是Java/lang/Class自从删除了“static”之后,您还没有重新生成.h/.c

env->CallVoidMethod在使用时返回java/lang/Class

env->GetObjectClass(aobject); //aobject was the argument sent by JNI to C++
AOObject是实现接口的Java对象

jobject obj = env->GetObjectClass(aobject) 

应该返回Java对象,但返回的是Java/lang/Class

自从删除了“static”之后,您还没有重新生成.h/.c文件,因此您的JNI方法签名与Java方法签名不匹配。在参数列表中有一个额外的jclass,它只用于静态方法。因此,您将得到一些非常奇怪的执行。

自从删除了“static”之后,您还没有重新生成.h/.c文件,因此您的JNI方法签名与Java签名不匹配。在参数列表中有一个额外的jclass,它只用于静态方法。因此,您将得到一些非常奇怪的执行。

我的问题的答案在沈亮的“Java本机接口-程序员指南和规范”中描述


“您也可以使用Call方法函数族来调用接口方法。您必须从接口类型派生方法ID”

沈亮的“Java本机接口-程序员指南和规范”中描述了我的问题的答案


“您也可以使用Call方法函数族来调用接口方法。您必须从接口类型派生方法ID”

我遇到了这个错误,在得到真正的答案之前,我不得不在工作中四处询问

问题是,当您将
本地
方法指定为
静态
时,它提供了
jclass
的实例,而不是该类的
jobject
实例,因为它是从静态上下文调用的。(如果在该
jclass
上调用
getCanonicalName()
,它将返回您的类名。)


如果本机方法需要是静态的,那么如果需要,应该将实例作为参数传入。否则,只需将其设置为非静态,就可以全部修复。

我遇到了这个错误,在得到真正的答案之前,我不得不在工作中四处询问

问题是,当您将
本地
方法指定为
静态
时,它提供了
jclass
的实例,而不是该类的
jobject
实例,因为它是从静态上下文调用的。(如果在该
jclass
上调用
getCanonicalName()
,它将返回您的类名。)


如果本机方法需要是静态的,那么如果需要,应该将实例作为参数传入。否则,只需将其设置为非静态,就可以全部修复。

我刚刚意识到,当我使用静态方法时,我发布了代码的版本,但我的代码具有正确的签名(JNIEnv*,jobject,jobject,jobject)。我用javahI获得了这个API签名,发现了问题,但我不能回答我自己的问题,因为我没有足够的信誉点:P。。。我将在几小时后发布我的答案。我刚刚意识到,当我使用静态方法时,我发布了我的代码版本,但我的代码有正确的签名(JNIEnv*,jobject,jobject,jobject)。我用javahI获得了这个API签名,发现了问题,但我不能回答我自己的问题,因为我没有足够的信誉点:P。。。我将在几小时后发布我的答案这不是你发布的问题的答案。这不是你发布的问题的答案。这个答案很好。但是,您可以通过一个示例来改进它。感谢您对堆栈溢出的贡献!这个答案很好。但是,您可以通过一个示例来改进它。感谢您对堆栈溢出的贡献!