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

时间:2012-02-01 19:52:25

标签: java c++ java-native-interface

我有一个Java函数,它返回一个Class

的单例实例
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吗?

1 个答案:

答案 0 :(得分:1)

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

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

应该这样做。

编辑:

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

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