我正在尝试让 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,例如() 我,我仍然看到一个 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;
}
关于java - Android C++ 上的 Qt 与 Java 的互操作性因 SIGSEGV 无效或原始返回类型而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22686745/