java - JNI 调用返回对象的 Java 函数导致 NoSuchMethodError

标签 java c++ java-native-interface

我有一个 Java 函数,它返回一个类的单例实例

public static synchronized MyClass getInstance() throws MyClassException{
    if (instance == NULL){
        // create
    } 
    return instance;
}

我想通过 C++ 代码调用它,但是当我这样做时,它返回了一个 NoSuchMethodError。

cls = jenv->FindClass("MyClass");
if (cls == NULL)
{
//error handling
}
mid = jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass");
if (mid == NULL)
{
//error handling
}

当我运行时:

javap -s -p on MyClass, I get the signature:
public static synchronized MyClass getInstance()   throws MyClassException;
Signature: ()LMyClass; 

如果我在 Java 类中将函数签名更改为 void,GetStaticMethodID 调用将按预期工作。

我是否需要设置一个 jobject 来期待调用的返回值?

如果不先调用 GetStaticMethodID 这可能吗?

最佳答案

我认为问题在于它无法解析指定的输出参数。如果您的 java 类在包中:“com/work/”,您会说:

jenv->GetStaticMethodID(cls, "getInstance", "()Lcom/work/MyClass;");

应该这样做。

编辑:

看起来答案就在 javap 的输出中,不是吗?你应该这样做:

jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass;");

关于java - JNI 调用返回对象的 Java 函数导致 NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9102299/

相关文章:

java - Eclipse、调试、表达式值

Java枚举实践中,不好的代码需要改进

Java Applet 无法清除屏幕上的文本

c++ - 通过网络发送指向静态函数的指针是否安全?

c++ - Boost::algorithms 是否包含在标准库中?

Java Jni 和 C++

java - 从启动的 jar 文件触发方法,该文件是通过 java 文件中的 Runtime...exec (".."加载的

c++ - EDSDK出错后如何重置摄像头

java - 如何从驻留在 OSGi 包中的类获取 JNI 中的 jclass

Java - 如何管理 JNI C 代码中的内存?