从使用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);
}
}
我有这个Qt方法应该调用HelloJava.sayHello()
方法:
QString call_HelloJava_sayHello(int a, int b) {
// What goes in here?
}
我在哪里将Java代码放在我的项目中,以及call_HelloJava_sayHello()
方法中的内容是什么?
答案 0 :(得分:1)
Qt doc在这个问题上非常冗长:
// 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:此变量可用于指定a 可以对默认值进行添加和修改的目录 Android包模板。 androiddeployqt工具将复制 应用程序模板从Qt进入构建目录,然后再进行构建 将复制ANDROID_PACKAGE_SOURCE_DIR的内容 这样,覆盖任何现有文件。部分更新步骤 源文件会自动修改以反映您的其他文件 然后在生成的合并包上运行设置。如果你,为 实例,想为你的自定义AndroidManifest.xml 应用程序,然后将其直接放入指定的文件夹中 这个变量。您还可以添加自定义Java文件 ANDROID_PACKAGE_SOURCE_DIR / SRC。
注意:添加构建文件的自定义版本(例如 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变量,将解析为项目目录。