Wir waren immer „Modul nicht gefunden“ Fehler, während wir versuchen, unser QML-Modul innerhalb einer Android Qt-Anwendung arbeiten zu bekommen. Mit Qt 5.3 haben wir es geschafft, unser QML-Plugin nur durch die Bereitstellung des Plugins im QT_INSTALL_QML-Verzeichnis zu erkennen, in dem sich offizielle Qt-QML-Module befinden. Dieses Verzeichnis ist in unserem Fall /opt/Qt/5.3/android_armv7/qml.
Plugin Side
Unsere .pro
Datei für das Plugin wie folgt aussieht:
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
}
Unsere qmldir
(in der Plugin-Source-Tree root) Datei ist:
module com.mycompany.qmlcomponents
plugin prova
Anwendung Seite
Die .pro-Datei wie folgt aussieht:
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
}
Wichtiger Hinweis: Jede Bibliothek, die Ihre qml Plugin nutzt auch in ANDROID_EXTRA_LIBS in Reihenfolge aufgeführt werden müssen, in die apk gebündelt zu werden. Dies schließt auch Qt-Komponenten ein, deren Auflistung in QT + = nicht ausreicht, wenn Sie sie nicht in Ihrer Anwendung verwenden.
Wir wissen nicht, ob die Aufnahme der zusätzlichen libprova.so notwendig ist. Es ist höchstwahrscheinlich nicht.
Die main.cpp
wie folgt aussieht:
#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();
}
Die main.qml
enthält nur das Plugin wie:
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtMultimedia 5.0
import com.mycompany.qmlcomponents 1.0
...
Bau und Deployment
Die Art, wie wir bauen und einzusetzen ist das Plugin zu qmake
(von der Android-Armv7 Toolchain von Qt), dann make install
.Es installiert die Datei qmldir und das Plugin .so in das Verzeichnis QT_INSTALL_QML.
Die Art, wie wir das Projekt erstellen und bereitstellen, die das Plugin verwendet, ist zu qmake
(wieder aus der Android-ARMv7 Werkzeugkette von Qt), dann make install INSTALL_ROOT=.
(installiert Verzeichnis bauen), dann androiddeployqt
laufen. Der letzte Befehl erstellt die Android-Projektstruktur mit den qmldirs in Assets/und Libraries in libs/und bündelt das Ganze in einer Apk über ant
. Einzelheiten zu diesem Verfahren finden Sie unter .
Kurz gesagt, konnten wir unser QML-Plugin nur innerhalb eines Android-Projekts erkennen, indem wir es in das private Qt qml-Verzeichnis einfügten. Ich hoffe, das hilft irgendwie.