"module “QtQuick” is not installed"(Android 移植)

"module “QtQuick” is not installed" (Android porting)

我正在尝试使用 qt5.4 将我的应用程序移植到 android,但出现此错误:

W/Qt (30916): qrc:/qml/FrontEnd.qml:1 ((null)): qrc:/qml/FrontEnd.qml:1:1:模块 "QtQuick" 未安装

这是我的.pro

TEMPLATE = app
TARGET = sandbox-build-android

QT+= qml quick widgets printsupport xml svg

INCLUDEPATH += [...]# my include path

# Input
HEADERS += [...] # my include
SOURCES += [...] # my source

RESOURCES += ../sandbox/resources.qrc

LIBS += -L$$PWD/../../edalab/else-datamodel-classes/build-buildAndroid-Android_for_armeabi_v7a_GCC_4_9_Qt_5_4_0-Debug/ -lbuildAndroid

INCLUDEPATH += [...]
DEPENDPATH += [...]

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
    ANDROID_EXTRA_LIBS = [..]
}

# Default rules for deployment.
include(deployment.pri)

这是我的 deployment.pri:

android-no-sdk {
    target.path = /data/user/qt
    export(target.path)
    INSTALLS += target
} else:android {
    x86 {
        target.path = /libs/x86
    } else: armeabi-v7a {
        target.path = /libs/armeabi-v7a
    } else {
        target.path = /libs/armeabi
    }
    export(target.path)
    INSTALLS += target
} else:unix {
    isEmpty(target.path) {
        qnx {
            target.path = /tmp/$${TARGET}/bin
        } else {
            target.path = /opt/$${TARGET}/bin
        }
        export(target.path)
    }
    INSTALLS += target
}

export(INSTALLS)

在我的 FrontEnd.qml 中,我有这个导入:

import QtQuick 2.4
import QtQuick.Controls 1.3

我没有看到与在 Android 上正常工作的示例项目的 .pro 有任何实质性区别。

更新

我看到另一个例子“Calendar”,我注意到我缺少这个标志“OTHER_FILES”,所以我将我的 QML 文件的所有路径添加到它,但问题仍然存在。

我还从我的智能手机中检索了 apk 并提取了内容。我注意到我的 apk 不包含一些存在于 apk 示例中的库:

libqml_Qt_labs_folderlistmodel_libqmlfolderlistmodelplugin.so libqml_Qt_labs_settings_libqmlsettingsplugin.so libqml_QtQml_Models.2_libmodelsplugin.so libqml_QtQml_StateMachine_libqtqmlstatemachine.so libqml_QtQuick.2_libqtquick2plugin.so libqml_QtQuick_Controls_libqtquickcontrolsplugin.so libqml_QtQuick_Controls_Styles_Android_libqtquickcontrolsandroidstyleplugin.so libqml_QtQuick_Dialogs_libdialogplugin.so libqml_QtQuick_Dialogs_Private_libdialogsprivateplugin.so libqml_QtQuick_Layouts_libqquicklayoutsplugin.so libqml_QtQuick_Window.2_libwindowplugin.so

我的项目目录结构

.
├── Project1
│   ├── file.pro
│   ├── images
│   │   ├── ...
│   ├── include
│   │   ├── sub1
│   │   │   ├── file1.hh
│   │   │   └── sub1.1
│   │   │       └── file2.hh
│   │   └── sub2
│   │       └── file3.hh
│   ├── qml
│   │   ├── file1.qml
│   │   └── sub1
│   │       ├── file2.qml
│   │       └── sub1.1
│   │           └── file3.qml
│   ├── README.txt
│   ├── resources.qrc
│   ├── src
│   │   ├── sub1
│   │   │   ├── file1.cc
│   │   │   └── sub1.1
│   │   │       └── file2.cc
│   │   ├── sub2
│   │   │   └── file3.cc
│   │   └── Main.cc
│   └── webUtils
│       └── file.html

这是一个示例 .pro 文件。我已经放弃了太具体的东西。目录结构如下:

.
├── Project
│   ├── app.pro
|   ├── android
|   │   ├── res
|   |   │   ├── drawable-hdpi
|   |   |   └── ... 
|   |   ├── AndroidManifest 
│   ├── content
│   │   ├── file1.qml
│   │   └── ...
|   ├── icons
│   ├── images
│   │   ├── ...
|   ├── include
│   │   ├── sub1
│   │   │   ├── file1.hh
│   │   │   └── sub1.1
│   │   │       └── file2.hh
│   │   └── sub2
│   │       └── file3.hh  
|   ├── ios
|   |   └── Info.plist
|   ├── libs 
|   |   ├── droid
|   |   ├── ios
|   |   ├── macx  
|   |   ├── nix
|   |   ├── win
|   |   └── winphone
│   ├── Qml.qrc
|   ├── Resources.qrc 
|   ├── SubProject
|   ├── translations
|   |   ├── app_en.qm
|   |   ├── ...
│   ├── [.cpp]
|   ├── [.h]
|   ├── app_en.ts

与你不同,我没有 src 目录,QML 文件被移动到 content 目录。我还有一个相同 QML 文件的资源文件,即 Qml.qrc。翻译文件(又名 .ts 文件)包含在带有源代码的主目录中。已编译的翻译(又名 .qm)文件位于子目录 translations.

目录 androidios 包含特定于平台的文件,特别是我们有 res directory useful to provide an icon and a wallpaper to the app for the android platform. The same android dir is used as APK package source (see .pro below). The ios directory contains the property list

lib 目录包含每个平台的子目录以及该环境的重新编译库。

对应的工程文件如下:

TEMPLATE = app
macx:CONFIG += app_bundle

# QT IMPORT
QT += gui qml quick [...]

#include subproject
include(SubProject/subproject.pri)
# Default rules for deployment
include(deployment.pri)
# Compilation flags [specific to the different OSs]
include(flags.pri)

TARGET = "appName"  # just needed for me since I change target between "App" and "AppPRO"

INCLUDEPATH += [...]
    $$PWD/include/sub1 \
    $$PWD/include/sub2 

!isEmpty(QMAKE_LFLAGS_RPATH):LIBS += \
$$QMAKE_LFLAGS_RPATH$${TOP_BUILD_DIR}/lib  #(UNIX ONLY): libs linked preferibly at runtime

# DESKTOP PLATFORMS
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/win/ -lLIBNAME1
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/win/ -lLIBNAMEd
unix:!macx:!ios:!android: LIBS  += -L$$PWD/lib/nix -lLIBNAME
macx: LIBS += -L$$PWD/lib/macx/ -lLIBNAME

# MOBILE PLATFORMS
ios: LIBS += -L$$PWD/lib/ios -lLIBNAME
android: LIBS  += -L$$PWD/lib/droid -lLIBNAME
winphone: LIBS +=  -L$$PWD/lib/winphone/ -lLIBNAME
# ADDITIONAL ANDROID SETTING
ANDROID_EXTRA_LIBS = $$PWD/lib/droid/libLIBNAME.so

# SOURCE FILES (.CPP)
SOURCES += [.cpp]

# HEADER FILES (.H)
HEADERS += [.h]

# objective-c++ sources for ios platform 
ios {
    QT += gui_private
    #QT -= printsupport
    HEADERS += [.h]
    OBJECTIVE_SOURCES += [.mm]
}

# QML sources are added here!
RESOURCES += Resources.qrc \
    Qml.qrc


# ANDROID ADDITION
android {
    ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android          # contains the dir structure of the APK, actually it contains just res
    OTHER_FILES += androidPro/AndroidManifest.xml       # <--- manifest for the Pro version
}



####  ICONS SECTION   ####
win32:RC_ICONS += $$ICON_PATH/multiIcon.ico   # ICONS for WIN
mac:!ios:ICON = $$ICON_PATH/icons.icns      # ICONS for MAC

#IOS BUNDLE                                 # ICONS for IOS
ios {
    BUNDLE_DATA.files = [...]
    QMAKE_BUNDLE_DATA += BUNDLE_DATA

QMAKE_INFO_PLIST = $$PWD/ios/Info.plist
}

# list QML sources for linguist purposes
lupdate_only{
SOURCES = *.qml \
          *.js \
          content/*.qml \
          content/*.js
}

# and the .ts file for translation!
TRANSLATIONS = app_en.ts \
               app_fr.ts \
               app_de.ts \
               app_sp.ts \
               app_en.ts

这是manifest。 Qt Creator 允许通过 UI 界面或文本编辑进行编辑。要添加清单(Qt Creator 3.3),如评论中所述,只需转到 Projects > Build > Build Android APK > Create Templates.

<?xml version="1.0"?>
<manifest android:versionCode="21" android:installLocation="auto" package="JAVA_PACKAGE" android:versionName="1.0.12" xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:hardwareAccelerated="true" android:label="@string/app_name" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:icon="@drawable/icon">
        <activity android:screenOrientation="unspecified" android:label="@string/app_name" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <meta-data android:value="app" android:name="android.app.lib_name"/>
            <meta-data android:resource="@array/qt_sources" android:name="android.app.qt_sources_resource_id"/>
            <meta-data android:value="default" android:name="android.app.repository"/>
            <meta-data android:resource="@array/qt_libs" android:name="android.app.qt_libs_resource_id"/>
            <meta-data android:resource="@array/bundled_libs" android:name="android.app.bundled_libs_resource_id"/>
            <!-- Deploy Qt libs as part of package -->
            <meta-data android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --" android:name="android.app.bundle_local_qt_libs"/>
            <meta-data android:resource="@array/bundled_in_lib" android:name="android.app.bundled_in_lib_resource_id"/>
            <meta-data android:resource="@array/bundled_in_assets" android:name="android.app.bundled_in_assets_resource_id"/>
            <!-- Run with local libs -->
            <meta-data android:value="-- %%USE_LOCAL_QT_LIBS%% --" android:name="android.app.use_local_qt_libs"/>
            <meta-data android:value="/data/local/tmp/qt/" android:name="android.app.libs_prefix"/>
            <meta-data android:value="-- %%INSERT_LOCAL_LIBS%% --" android:name="android.app.load_local_libs"/>
            <meta-data android:value="-- %%INSERT_LOCAL_JARS%% --" android:name="android.app.load_local_jars"/>
            <meta-data android:value="-- %%INSERT_INIT_CLASSES%% --" android:name="android.app.static_init_classes"/>
            <!--  Messages maps -->
            <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
            <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
            <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
            <!--  Messages maps -->
            <!-- Splash screen -->
            <meta-data android:resource="@drawable/splash" android:name="android.app.splash_screen_drawable"/>
            <!-- Splash screen -->
        </activity>
    </application>
    <uses-sdk android:targetSdkVersion="19" android:minSdkVersion="9"/>
    <supports-screens android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" android:largeScreens="true" android:anyDensity="true"/>
    <!-- %%INSERT_PERMISSIONS -->
    <!-- %%INSERT_FEATURES -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>