当我们试图让 QML 模块在 Android Qt 应用程序中工作时,我们遇到了“模块未找到”错误。在 Qt 5.3 中,我们仅通过将插件部署到官方 Qt QML 模块所在的 QT_INSTALL_QML 目录来设法让我们的 QML 插件被识别。在我们的例子中,该目录是 /opt/Qt/5.3/android_armv7/qml。
插件端
Our .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
}
Our 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。很可能不是。
The 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();
}
The 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
。最后一个命令使用 asset/ 中的 qmldirs 和 libs/ 中的库创建 Android 项目结构,并通过以下方式将整个内容捆绑在 apk 中ant
。有关此过程的详细信息,请参阅http://qt-project.org/wiki/Android http://qt-project.org/wiki/Android.
简而言之,我们只能通过将 QML 插件放入私有 Qt qml 目录中来使其在 Android 项目中被识别。我希望这能在某种程度上有所帮助。