Как использовать 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, которая будет преобразована в каталог проекта

Другие вопросы по тегам