Предполагая, что ваше приложение Qt используется только для его логики (не на стороне GUI), что вам нужно:
Добавление JNI в вашу библиотеку Qt для Android
JNI (собственный интерфейс Java) позволяет создавать интерфейс для связи и использования собственного (C ++) кода из Java. Это используется для переноса кода C ++ и предоставления функций, видимых и используемых непосредственно из вашего приложения Android
- Установите нужную версию Qt для Android с помощью онлайн-установщика Qt (флажок при выборе нужной версии Qt)
- Создайте интерфейс JNI, чтобы ваше приложение и библиотека могли общаться. Это рассматривается в этом примере: https://developer.android.com/ndk/samples/sample_hellojni. Я, вероятно, рекомендовал бы создать другую библиотеку C ++ / JNI, выступающую в качестве оболочки для вашей библиотеки C ++ / Qt. Таким образом, вы не загрязняете исходную библиотеку зависимостями JNI.
Интегрируйте свою библиотеку JNI в свое приложение
Если у вас есть интерфейс JNI, вы должны сделать кросс-компиляцию и отправить эту библиотеку вместе с приложением для Android
- Создайте свою нативную библиотеку из Android Studio (после указания на ваши библиотеки Qt и включите dir). Кроме того, вы можете вручную собрать его из Qt Creator (немного проще) и импортировать только получившийся
.so
. Но это будет больно, если ваша библиотека Qt изменится
- Упакуйте библиотеку (
.so
) и загрузите ее при запуске приложения. Это также рассматривается в примере. После загрузки библиотеки вы сможете использовать представленные вами функции JNI и передавать аргументы после некоторой работы по преобразованию. Ваше Android-приложение также может передавать дескриптор в собственную библиотеку, позволяя общаться обоими способами.
Примечания
- Будьте осторожны с лицензированием вашего проекта. Кросс-компиляция Qt для Android, скорее всего, переключится на GPLv3 или коммерческую лицензию по сравнению с LGPLv3 без Android.
- Библиотеки Qt должны быть включены в ваш окончательный пакет. Поэтому они либо должны быть статически связаны с вашей исходной библиотекой, либо динамически связаны, и храниться в вашем APK
- Вы можете использовать классы Qt JNI, чтобы упростить создание интерфейса, но это не обязательно: https://doc.qt.io/qt-5/qandroidjniobject.html
- Потоки могут стать трудными, так как вызовы в / из JNI должны выполняться из основного потока
Я бы порекомендовал начать с рабочего примера, если вы его найдете, поскольку вся эта настройка определенно займет некоторое время. Я не знаю полного учебника, охватывающего это, но не стесняйтесь поделиться, если найдете его!