2014-03-29 10 views
7

Ich habe viel mit dem Box2D QML Plugin gespielt und die Dinge sehen wirklich gut aus. Allerdings wollte ich meine Beispiel-App auf Android (SGS2) bereitstellen, aber ich kann nicht funktionieren. Ob ich versuche, es auf AVD oder auf dem Gerät auszuführen, funktioniert es nicht. androiddeployqt beendet erfolgreich, aber dann bekomme ich "Kann MyApp nicht starten" und keine anderen Informationen, warum es nicht gestartet werden konnte. Ich kann qml apps auf dem AVD und dem Gerät erfolgreich ausführen, aber das hat etwas mit dem Plugin zu tun und ich kann keine Referenz finden, um es zu lösen.Was ist der richtige Weg für die Bereitstellung von C++ - QML-Plugins auf mobilen Geräten?

Ich habe versucht, auf verschiedene Arten DEPLOYMENTFOLDERS einzurichten, aber wenn ich sie falsch verstehe, dann schlägt das Ganze fehl. Selbst wenn ich keinen Fehler erhalte, in welchem ​​Fall ich davon ausgehe, dass ich es richtig verstanden habe, startet es immer noch nicht.

Ich habe mit dieser für einige Zeit zu kämpfen, und kann kein bisschen nützliche Informationen finden, um es zu lösen. Wenn Sie ein Projekt kennen, das ein C++ - Plugin verwendet und erfolgreich auf einem Android-Gerät bereitgestellt werden kann, wäre das auch gut.

Ich bin mit Qt 5.2.0 für Android kompiliert und den QT5 Zweig der box2d

Antwort

6

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.

Verwandte Themen