Как использовать 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() метод?

3

Решение

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: эту переменную можно использовать для указания
каталог, в который могут быть внесены дополнения и изменения по умолчанию
Шаблон пакета 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, которая будет преобразована в каталог проекта

1

Другие решения


По вопросам рекламы [email protected]