我有一个 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/