Как использовать QAndroidJniObject для вызова кода Java изнутри Qt?
Начиная с пустого проекта Qt for Android, созданного с помощью Qt Creator, как мне выполнить нативный код 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()
метод?
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 для своего приложения, поместите его прямо в папку, указанную в этой переменной. Вы также можете добавить пользовательские файлы Java в ANDROID_PACKAGE_SOURCE_DIR/src.
Примечание. При добавлении пользовательских версий файлов сборки (таких как strings.xml, libs.xml, AndroidManifest.xml и т. Д.) В ваш проект убедитесь, что вы скопировали их из шаблона пакета, который находится в $QT/src/ Android/ Java. Вы никогда не должны копировать файлы из каталога сборки, так как эти файлы были изменены в соответствии с текущими настройками сборки.
Так что, кажется, вам нужно указать это, и Java-файлы будут автоматически развернуты.
Просто добавьте это в свой.pro-файл (при условии, что ваши исходники Java размещены на /path/to/project/myjava/src
:
android {
ANDROID_PACKAGE_SOURCE_DIR=$$_PRO_FILE_PWD_/android
QT += androidextras
}
_PRO_FILE_PWD_
переменная qmake, которая будет преобразована в каталог проекта