JNI调用Java函数返回一个Object导致NoSuchMethodError

don*_*lmg 5 c++ java java-native-interface

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

public static synchronized MyClass getInstance() throws MyClassException{
    if (instance == NULL){
        // create
    } 
    return instance;
}
Run Code Online (Sandbox Code Playgroud)

我想通过C++代码调用它,但是当我这样做时,它会返回NoSuchMethodError.

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

当我跑:

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

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

我是否需要设置一个jobject以期望来自呼叫的返回值?

这可以不先调用GetStaticMethodID吗?

ete*_*00b 1

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

jenv->GetStaticMethodID(cls, "getInstance", "()Lcom/work/MyClass;");
Run Code Online (Sandbox Code Playgroud)

应该可以做到这一点。

编辑:

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

jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass;");
Run Code Online (Sandbox Code Playgroud)