java - Android C++ 上的 Qt 与 Java 的互操作性因 SIGSEGV 无效或原始返回类型而失败

标签 java android c++ java-native-interface qt5

我正在尝试让 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/

相关文章:

c++ - 指向 C++ 中动态分配的二维数组中一行的指针

c++ - 就 ABI 兼容性而言,静态库的行为是否与动态库类似?

java - null是引用类型,是String引用还是Object引用?

android - Crashlytics 添加新的 applicationIdSuffix

android - 列出存储在用户凭据中的证书

android 使用 AccountManager 添加帐户,找不到处理 Intent 的 Activity { act=android.settings.ADD_ACCOUNT_SETTINGS(有附加功能)}

c++ - 基于 ZeroMQ session 的请求分派(dispatch)或条件路由

java - Docker 容器中的 JVM 初始 CPU 峰值

java - 弃用的方法,用什么代替?

java - 更新 spring webflow 中的对象未显示在 UI 上