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吗?
我认为问题在于它无法解析指定的输出参数。如果你的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)
| 归档时间: |
|
| 查看次数: |
3458 次 |
| 最近记录: |