Android c++上的Qt与Java的互操作性在SIGSEGV为void或基本返回类型时失败

Qt on Android C++ to Java interoperability fails with SIGSEGV for void or primitive return type

本文关键字:void 失败 返回类型 SIGSEGV Qt 上的 c++ Java 互操作性 Android      更新时间:2023-10-16

我正在尝试在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;
}