2014-03-29 57 views
7

我已經打了很多與Box2D的QML插件和事情看起來真的很不錯。 但是,我想在Android(SGS2)上部署我的示例應用程序,但似乎無法使其工作。無論我嘗試在AVD上還是在設備上運行它,它都不起作用。 androiddeployqt成功完成,但後來我得到「無法啓動'MyApp'」,沒有其他信息說明它爲什麼無法啓動。我可以在AVD和設備上成功運行qml應用程序,但這與插件有關,我無法找到任何參考來解決它。在移動設備上部署C++ QML插件的正確方式是什麼?

我嘗試用不同的方式建立DEPLOYMENTFOLDERS,但如果我讓他們錯了,那麼整個事情失敗。即使我沒有得到一個錯誤,在這種情況下,我認爲我是對的,但它仍然沒有開始。

我一直在努力與這個安靜一段時間,並不能找到有用的信息的任何位,以解決這個問題。 如果你知道任何使用C++插件並且可以在android設備上成功部署的項目,那也不錯。

我使用Qt 5.2.0編譯Android和的Box2D的

回答

6

我們得到的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插件。我希望這有助於某種方式。

相關問題