You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt Android应用调用返回jdoubleArray的Java方法编译报错求助

解决Qt Android中QAndroidJniObject调用返回jdoubleArray方法的编译错误

这个链接错误是因为你误用了callMethod<T>模板——它只针对基本JNI类型(比如jint、jfloat这类简单数值类型),而jdoubleArray属于jobject的子类(数组类型在JNI里都是对象),Qt没有为这类对象类型提供callMethod<T>的模板实例,所以链接器找不到对应的函数实现。

修正后的代码

你需要改用callObjectMethod来调用返回对象/数组类型的Java方法,然后将返回结果转换为jdoubleArray:

QAndroidJniObject javaCode("com/example/MyJavaCode"); // 注意:这里应该是完整的Java类路径,比如包名+类名,用斜杠分隔
jdoubleArray result = static_cast<jdoubleArray>(javaCode.callObjectMethod("detect", "([C)[D", buffer_java).object());

关键细节解释

  • 为什么用callObjectMethod?
    callObjectMethod是Qt专门为返回jobject及其子类(包括所有数组类型、自定义Java对象)的方法设计的,它返回一个QAndroidJniObject包装对象,你可以通过.object()获取底层的JNI对象指针,再静态转换为你需要的数组类型。

  • 检查Java方法签名
    你的签名"([C)[D"表示:接收一个char[](对应JNI的jcharArray),返回一个double[](对应jdoubleArray)。如果你的Java方法实际接收的是byte[](比如C++的const char*更常对应Java的byte[]),那签名要改成"([B)[D",必须和Java方法的参数类型严格匹配。

  • JNI数组的正确传递
    如果你的buffer_java是从C++的const char*转换来的,要确保生成的JNI数组类型和Java方法参数一致:

    // 示例:把C++ const char*转为Java byte[]
    const char* rawBuffer = "your input data";
    int bufferLen = strlen(rawBuffer);
    QAndroidJniEnvironment env;
    jbyteArray buffer_java = env->NewByteArray(bufferLen);
    env->SetByteArrayRegion(buffer_java, 0, bufferLen, reinterpret_cast<const jbyte*>(rawBuffer));
    
    // 调用Java方法...
    
    // 记得释放局部引用,避免内存泄漏
    env->DeleteLocalRef(buffer_java);
    
  • Java类路径的正确性
    注意QAndroidJniObject的构造函数参数应该是完整的Java类名(比如"com/example/MyJavaCode"),开头不要加斜杠,除非你的类在默认包下且类名是myJavaCode(不过Java类名通常首字母大写)。

内容的提问来源于stack exchange,提问作者Pierre Issartel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:51:26