3

从使用 Qt Creator 创建的空 Qt for Android 项目开始,我如何执行本机 Java 代码?

例如,如果我有这个 java 方法:

class HelloJava {
    public static String sayHello(int a, int b) {
        return "Hello from Java, a+b=" + (a+b);
    }
}

我有这个应该调用该方法的 QtHelloJava.sayHello()方法:

QString call_HelloJava_sayHello(int a, int b) {
    // What goes in here?
}

我应该将 Java 代码放在我的项目中的什么位置,以及该call_HelloJava_sayHello()方法中的内容是什么?

4

1 回答 1

1

Qt 文档在这个主题上非常冗长:

// Java class
package org.qtproject.qt5;
class TestClass
{
   static String fromNumber(int x) { ... }
   static String[] stringArray(String s1, String s2) { ... }
}


// C++ code

// The signature for the first function is "(I)Ljava/lang/String;"
QAndroidJniObject stringNumber = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                           "fromNumber"
                                                                           "(I)Ljava/lang/String;",
                                                                           10);

// the signature for the second function is "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
QAndroidJniObject string1 = QAndroidJniObject::fromString("String1");
QAndroidJniObject string2 = QAndroidJniObject::fromString("String2");
QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                          "stringArray"
                                                                          "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
                                                                           string1.object<jstring>(),
                                                                           string2.object<jstring>());

所以你的函数的信号应该是"(I;I;)Ljava/lang/String;"

还有这个:

ANDROID_PACKAGE_SOURCE_DIR:此变量可用于指定可以对默认 Android 包模板进行添加和修改的目录。androiddeployqt 工具会将应用程序模板从 Qt 复制到构建目录中,然后它会在此之上复制 ANDROID_PACKAGE_SOURCE_DIR 的内容,覆盖所有现有文件。然后在生成的合并包上运行自动修改部分源文件以反映您的其他设置的更新步骤。例如,如果您想为您的应用程序创建一个自定义 AndroidManifest.xml,则将其直接放入此变量中指定的文件夹中。您还可以在 ANDROID_PACKAGE_SOURCE_DIR/src 中添加自定义 Java 文件。

注意:将自定义版本的构建文件(如 strings.xml、libs.xml、AndroidManifest.xml 等)添加到您的项目时,请确保从位于 $QT/src/ 的包模板中复制它们安卓/Java。您永远不应从构建目录复制任何文件,因为这些文件已被更改以匹配当前构建设置。

因此,您似乎需要指定并自动部署 java 文件。

只需将其添加到您的 .pro 文件中(假设您的 java 源代码位于/path/to/project/myjava/src

android {
    ANDROID_PACKAGE_SOURCE_DIR=$$_PRO_FILE_PWD_/android
    QT += androidextras
}

_PRO_FILE_PWD_是一个 qmake 变量,将解析到项目目录。

于 2014-11-23T22:31:34.227 回答