我正在尝试在Android c++上获得Qt 5.2.1到Java互操作工作。
我有一段c++代码,它使用QAndroidJniObject来调用Java类的静态方法。
可以(先c++,然后Java):
QAndroidJniObject::callStaticObjectMethod(
"org/example/AndroidTest",
"doSomething",
"()Ljava/lang/String;"
);
public static String doSomething() {
return "Done something.";
}
但是,我有一个具有void
返回类型的方法,因此:
QAndroidJniObject::callStaticObjectMethod(
"org/example/AndroidTest",
"doSomething",
"()V"
);
public static void doSomething() {
}
方法签名是()V
,我理解这意味着一个不带参数的方法,有一个void
返回类型-所以它应该匹配我的Java方法。
问题是在执行时,当callStaticObjectMethod
调用返回时,这会在libc中导致SIGSEGV。
如果我添加调试跟踪,我看到Java类正确进入和退出,SIGSEGV在返回到c++代码时发生。事实上,如果我改变方法签名返回一个int,例如()I,我仍然看到一个SIGSEGV,所以我很确定问题与返回类型有关,但我不明白为什么它失败了。
如果您调用返回void或其中一种基本类型的Java方法,则应该使用callStaticMethod。另外,如果Java方法不接受任何参数,签名可以省略,例如:
QAndroidJniObject::callStaticMethod<void>("org/example/AndroidTest", "doSomething");
public static void doSomething()
{
}
jint value = QAndroidJniObject::callStaticMethod<jint>("org/example/AndroidTest", "doSomethingElse");
public static int doSomethingElse()
{
return 1;
}