Android c++上的Qt与Java的互操作性在SIGSEGV为void或基本返回类型时失败
Qt on Android C++ to Java interoperability fails with SIGSEGV for void or primitive return type
我正在尝试在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;
}
相关文章:
- 如果没有malloc,链表实现将失败
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- 断言失败(scn == 3 || scn == 4)void cv :: cvtcolor(cv :: inputArr
- C++重写 void 函数返回类型会导致生成失败
- C强制转换失败:无法从void*强制转换为C结构
- 由于未知原因,在void函数中创建(大)对象失败
- 使用 int main(void) 编译失败;main(int argc, char *argv[]) successs
- 从"const T pointer" "void pointer" const_cast失败
- Android c++上的Qt与Java的互操作性在SIGSEGV为void或基本返回类型时失败
- 编译错误:C/ c++中cast void *失败