Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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
对返回对象的Java函数的JNI调用将导致NoSuchMethodError_Java_C++_Java Native Interface - Fatal编程技术网

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

对返回对象的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

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

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;”);这很好。这对你有用吗?是的,没有分号。谢谢