在移动设备上部署C ++ QML插件的正确方法是什么?

时间:2014-03-29 14:47:27

标签: qt qml qtquick2

我一直在使用Box2D QML插件玩很多东西,看起来非常棒。 但是,我想在Android(SGS2)上部署我的示例应用程序,但我似乎无法让它工作。无论我是尝试在AVD上还是在设备上运行它,它都不起作用。 androiddeployqt成功完成,但后来我得到“无法启动'MyApp'”而没有其他信息说明为什么它无法启动。我可以在AVD和设备上成功运行qml应用程序,但这与插件有关,我找不到任何引用来解决它。

我尝试以不同的方式设置DEPLOYMENTFOLDERS,但如果我弄错了,那么整件事就会失败。即使我没有收到错误,在这种情况下我认为我做对了,它仍然无法启动。

我一直在努力安静一段时间,并且找不到任何有用的信息来解决它。 如果您知道任何使用c ++插件并且可以在Android设备上成功部署的项目,那也会很好。

我正在使用为Android编译的Qt 5.2.0和box2d的qt5分支

1 个答案:

答案 0 :(得分:6)

当我们试图让我们的QML模块在Android Qt应用程序中运行时,我们得到了“模块未找到”错误。在Qt 5.3中,我们设法通过将插件部署到官方Qt QML模块所在的QT_INSTALL_QML目录来获得我们的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

申请方

.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.so。这很可能不是。

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(来自Qt的android-armv7工具链),然后是make install。它将qmldir文件和插件.so安装到QT_INSTALL_QML目录中。

我们构建和部署使用该插件的项目的方式是qmake(再次,来自Qt的android-armv7工具链),然后是make install INSTALL_ROOT=.(安装到构建目录),然后运行androiddeployqt。最后一个命令使用资源/中的qmldirs和libs /中的库创建Android项目结构,并通过ant将所有内容捆绑在apk中。有关此过程的详细信息,请参阅http://qt-project.org/wiki/Android

简而言之,我们只能通过将其置于私有Qt qml目录中来获取我们在Android项目中识别的QML插件。我希望这会有所帮助。