Qt Android应用调用返回jdoubleArray的Java方法编译报错求助
这个链接错误是因为你误用了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

