1

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

env->GetObjectClass(aobject); //aobject was the argument sent by JNI to C++

aobject 是实现接口的 Java 对象。

jobject obj = env->GetObjectClass(aobject) 

应该返回 Java 对象,而是返回 java/lang/Class

4

3 回答 3

1

我遇到了这个错误,不得不在工作中四处打听,才能得到真正的答案。

问题是,当您将native方法指定为时static,它会提供 的实例,而jclass不是jobject该类的实例,因为它是从静态上下文中调用的。(如果您调用getCanonicalName()jclass,它将返回您的班级名称。)

如果本机方法需要是静态的,那么您应该在需要时将实例作为参数传入。否则,只要让它不是静态的,你就应该是固定的。

于 2019-07-30T19:10:59.213 回答
0

我的问题的答案在沈良的《Java Native Interface - Programmer's Guide and Specification》中有描述。

“您也可以使用 Call<Type>Method 系列函数来调用接口方法。您必须从接口类型派生方法 ID”

于 2012-05-23T17:52:54.107 回答
0

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

于 2012-05-22T22:30:18.527 回答