我們得到的QT5分支「模塊找不到」錯誤,當我們試圖讓我們的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插件。我希望這有助於某種方式。