对返回对象的Java函数的JNI调用将导致NoSuchMethodError
我有一个Java函数,它返回一个类的单例实例对返回对象的Java函数的JNI调用将导致NoSuchMethodError,java,c++,java-native-interface,Java,C++,Java Native Interface,我有一个Java函数,它返回一个类的单例实例 public static synchronized MyClass getInstance() throws MyClassException{ if (instance == NULL){ // create } return instance; } < >我想通过C++代码调用这个,但是当我这样做时,它返回一个NouChuthMeoDoRoR。 cls = jenv->FindClass("My
public static synchronized MyClass getInstance() throws MyClassException{
if (instance == NULL){
// create
}
return instance;
}
< >我想通过C++代码调用这个,但是当我这样做时,它返回一个NouChuthMeoDoRoR。
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;");
返回错误的调用在哪里?当我运行C++应用程序时,我得到了:“主”java. Lang.NouChoMeoDoRoor:GETSistChani怀疑是否需要在调用GetStaticMethodId时指定“MyClass”的完全限定路径。例如:jenv->GetStaticMethodID(cls,“getInstance”,“Lcom/work/MyClass;”);取决于CPP代码相对于Java代码的位置?只是一个想法。我原来的问题打错了。我将其命名为()LMyClass,您明确地说了“()LMyClass;”,末尾带有分号?例如,我可以这样做:getStaticMethodID(cls,“currentThread”,“()Ljava/lang/Thread;”);这很好。这对你有用吗?是的,没有分号。谢谢