Каков правильный способ развертывания плагинов C++ QML на мобильном устройстве?

Я много играл с плагином Box2D QML, и все выглядит очень хорошо. Тем не менее, я хотел развернуть пример приложения на Android (SGS2), но я не могу заставить его работать. Пытаюсь ли я запустить его на AVD или на устройстве, он не работает. androiddeployqt завершается успешно, но затем я получаю "не удалось запустить" MyApp "" и никакой другой информации о том, почему он не запустился. Я могу успешно запускать приложения qml на AVD и устройстве, но это имеет какое-то отношение к плагину и Я не могу найти никакой ссылки, чтобы решить ее.

Я попытался настроить DEPLOYMENTFOLDERS по-разному, но если я ошибаюсь, то все это терпит неудачу. Даже когда я не получаю ошибку, в этом случае я предполагаю, что все правильно, она все равно не запускается.

Я боролся с этим в течение некоторого времени, и не могу найти никакой полезной информации, чтобы решить эту проблему. Если вы знаете какой-либо проект, который использует плагин c++ и может быть успешно развернут на android-устройство, это было бы хорошо.

Я использую Qt 5.2.0, скомпилированный для android и ветви Qt5 box2d

1 ответов


мы получали ошибки "модуль не найден", когда мы пытались заставить наш модуль QML работать внутри приложения Android Qt. С Qt 5.3 нам удалось получить наш плагин QML, распознанный только путем развертывания плагина в каталоге QT_INSTALL_QML, где находятся официальные модули Qt QML. В нашем случае это каталог /opt/Qt/5.3/android_armv7/qml.

Боковая Плагин

наши .pro файл для плагина выглядит так:

TEMPLATE = lib
TARGET = prova
QT += qml quick multimedia
CONFIG += qt plugin c++11 console
CONFIG -= android_install
TARGET = $$qtLibraryTarget($$TARGET)
uri = com.mycompany.qmlcomponents

# Input
SOURCES += \
    src1.cpp \
    src2.cpp

HEADERS += \
    src1.h \
    src2.h

##The below is generated automatically by Qt Creator when you create a new "Qt Quick 2 Extension Plugin" project for Android

#Copies the qmldir file to the build directory
!equals(_PRO_FILE_PWD_, $$OUT_PWD) {
    copy_qmldir.target = $$OUT_PWD/qmldir
    copy_qmldir.depends = $$_PRO_FILE_PWD_/qmldir
    copy_qmldir.commands = $(COPY_FILE) \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\"
    QMAKE_EXTRA_TARGETS += copy_qmldir
    PRE_TARGETDEPS += $$copy_qmldir.target
}

#Copies the qmldir file and the built plugin .so to the QT_INSTALL_QML directory
qmldir.files = qmldir
unix {
    installPath = $$[QT_INSTALL_QML]/$$replace(uri, \., /)
    qmldir.path = $$installPath
    target.path = $$installPath
    INSTALLS += target qmldir
}

наши qmldir (в корне дерева источника плагина) файл:

module com.mycompany.qmlcomponents
plugin prova

Программа

The .pro файл выглядит так:

TEMPLATE = app

QT += qml quick widgets multimedia

CONFIG+= console
SOURCES += main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Default rules for deployment.
include(deployment.pri)

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
    ANDROID_EXTRA_LIBS = \
        /opt/Qt/5.3/android_armv7/qml/com/mycompany/qmlcomponents/libprova.so
}

Важное Замечание: любая библиотека, которую использует ваш плагин qml, также должна быть указана в ANDROID_EXTRA_LIBS, чтобы быть в комплекте в apk. Это также включает компоненты Qt, перечисление их в QT+= недостаточно, если вы не используете их в своем приложении.

мы на самом деле не знаем, включено ли дополнительное libprova.это необходимо. Скорее всего, нет.

на main.cpp выглядит так:

#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
    return app.exec();
}

на main.qml просто включает плагин, как:

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtMultimedia 5.0

import com.mycompany.qmlcomponents 1.0

...

Строительство и развертывание

способ создания и развертывания плагина -qmake (из цепочки инструментов android-armv7 Qt), затем make install. Он устанавливает файл qmldir и плагин .так что ... Каталог QT_INSTALL_QML.

способ создания и развертывания проекта, использующего плагин, заключается в qmake (опять же, из цепочки инструментов android-armv7 Qt), затем make install INSTALL_ROOT=. (устанавливается для создания каталога), затем запустите androiddeployqt. Последняя команда создает структуру проекта Android с qmldirs в активах/ и библиотеках в libs/ и связывает все это в apk через ant. Подробности этой процедуры см. В разделеhttp://qt-project.org/wiki/Android.

короче говоря, мы смогли получить наш плагин QML, распознанный внутри проекта Android, поместив его в частный каталог Qt qml. Надеюсь, это как-то поможет.