在移动设备上部署 C++ QML 插件的正确方法是什么?

2024-02-23

我经常使用 Box2D QML 插件,看起来效果非常好。 但是,我想在 Android (SGS2) 上部署我的示例应用程序,但我似乎无法让它工作。无论我尝试在 AVD 上还是在设备上运行它,它都不起作用。 androiddeployqt 成功完成,但随后我收到“无法启动 'MyApp'”,并且没有其他信息说明其无法启动的原因。我可以在 AVD 和设备上成功运行 qml 应用程序,但这与插件有关,我找不到任何参考来解决它。

我尝试以不同的方式设置部署文件夹,但如果我弄错了,那么整个事情都会失败。即使我没有收到错误(在这种情况下我认为我做对了),它仍然无法启动。

我已经为此苦苦挣扎了一段时间,找不到任何有用的信息来解决它。 如果您知道任何使用 C++ 插件并且可以成功部署在 Android 设备上的项目,那也很好。

我正在使用为 android 编译的 Qt 5.2.0 和 box2d 的 qt5 分支


当我们试图让 QML 模块在 Android Qt 应用程序中工作时,我们遇到了“模块未找到”错误。在 Qt 5.3 中,我们仅通过将插件部署到官方 Qt QML 模块所在的 QT_INSTALL_QML 目录来设法让我们的 QML 插件被识别。在我们的例子中,该目录是 /opt/Qt/5.3/android_armv7/qml。

插件端

Our .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
}

Our 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。很可能不是。

The 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();
}

The 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。最后一个命令使用 asset/ 中的 qmldirs 和 libs/ 中的库创建 Android 项目结构,并通过以下方式将整个内容捆绑在 apk 中ant。有关此过程的详细信息,请参阅http://qt-project.org/wiki/Android http://qt-project.org/wiki/Android.

简而言之,我们只能通过将 QML 插件放入私有 Qt qml 目录中来使其在 Android 项目中被识别。我希望这能在某种程度上有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在移动设备上部署 C++ QML 插件的正确方法是什么? 的相关文章

随机推荐

  • 您如何在 VIM 中使用 FASD 和 FZF 的外部导航?

    您是否找到了使用 FASD 或 fzf 和 VIM 进行文件导航的舒适工作流程 我在 VIM 中打开最近的文件时遇到问题 因为 FASD 无法捕获它们 我正在寻找一些技巧 FASD 工作流程 将以下行放入您的 zshrc alias v f
  • Cloud Foundry 应用程序正在运行的实例数

    我的应用程序需要获取其运行的实例数 在运行时我的应用程序在程序逻辑中使用此信息 VCAP APPLICATION 环境变量无法提供此信息 直接调用 API 并使用 实例 属性是一种选择 但我不知道如何在我的应用程序中直接调用应用程序 API
  • 在 angular2 中使用 http 访问 Amazon s3

    我的 Amazon s3 存储桶中有一个 json 文件 当我尝试在 Angular2 应用程序中使用 http 调用访问该文件时 出现错误 跨源请求被阻止 同源策略不允许读取 远程资源位于https s3 us east 2 amazon
  • Directory.Exists 对时间敏感吗?

    我的应用程序中有以下代码 if Directory Exists myPath Directory CreateDirectory myPath 如果我在常规单元测试中运行它 有时它会通过 有时则不会 该目录始终存在 我确定了这一点 因此从
  • 如何在Mysql中创建一个id(自动递增)并与其连接一个字符串?仅使用 PHP

    需要创建一个具有自动递增主键的 id 必须使用 php 将字符串与该 id 一起存储 如下所示 我的sql必须显示 ID WFS001 WFS002 WFS003 WFS005 一个选项是有一个自动增量列 执行插入 获取最后一个 idLAS
  • 如何从主线程唤醒休眠线程?

    我有一个捕获程序 除了捕获数据并将其写入文件外 还打印一些统计信息 打印统计信息的函数 static void report void Print statistics 大约每秒调用一次 使用每秒到期的警报 所以该程序就像 void cap
  • 触发锚链接的点击

    我有一个链接集合 其中包含与它们匹配的缩略图 我需要将这些缩略图加载为 div 并为其设置背景图像 我使用的是包含所有缩略图的单个图像 因此我不能仅将图像加载为图像 单击图像应该与单击链接执行相同的操作 但我制作了一个 JSFiddle 来
  • CLR 如何知道装箱对象的类型?

    当值类型被装箱时 它被放置在untyped参考对象 那么是什么原因导致这里出现无效的强制转换异常呢 long l 1 object obj object l double d double obj 不 它没有放置在无类型对象中 对于每种值类
  • jmeter无法记录浏览器操作

    我正在使用 apache jmeter 2 6 我想使用 HTTP 代理服务器记录浏览器操作 但动作并没有记录 我已经在线程组下定义了 HTTP 请求默认值 我为服务器名称指定了值 如下所示 http www xxxxx com 81 ht
  • 在 Codeigniter 中手动调用/调用挂钩

    我搜索了手动调用 调用钩子以及网上类似的东西 但找不到任何东西 codeigniter中有这样的东西吗 我下面有一个钩子 它会按预期触发 但以防万一没有触发 那么我想在代码中手动调用它 Thanks hook post controller
  • 使用 DotNetOpenAuth 创建 OAuth 2.0 服务提供者

    我正在构建一个 Web 应用程序 它将有一个 api 和一个使用 DotNetOpenAuth 的授权服务 我发现这个例子 http scatteredcode wordpress com 2011 12 01 dotnetopenauth
  • 类型错误:“NoneType”对象无法使用函数结果进行迭代

    我在 companyName monthAverage costPerTon totalCost displayCost companyName monthAverage costPerTon totalCost 行上收到 TypeErro
  • maxlength 属性的角度验证消息

    我在 Angular 中显示 maxlength 属性的错误消息时遇到一些问题 Problem 由于 maxlength 属性不允许的字符数超过指定数量 因此我无法显示错误消息 有什么方法可以关闭默认行为 允许用户输入更多字符 以显示我的错
  • Linux/X11下如何隐藏鼠标指针?

    如何在X11下隐藏鼠标指针 我想使用内置库来执行此操作 而不是使用 SDL SDL ShowCursor 0 或 glut glutSetCursor GLUT CURSOR NONE 之类的库 此外 无论指针位置如何 鼠标指针都应该隐藏
  • 在 Windows 中启动 Confluence Schema Registry

    我有Windows环境和我自己的一套kafka和zookeeper正在运行 为了使用自定义对象 我开始使用 Avro 但我需要启动注册表 下载 Confluence 平台并运行 bin schema registry start etc s
  • 哪种编程语言最能弥合伪代码和代码之间的差距? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当我从现在开始编写代码时 我计划首先用漂亮 可读的伪代码来布局所有内容 然后围绕该结构实现程序 如果我将我目前掌握的语言从最容易翻译到最难翻译进
  • Git 告诉我拉,然后提交,然后拉?

    我正在尝试推送新的更改 但我有一个冲突的文件 尝试推送后 出现以下错误 Merge the remote changes e g git pull before pushing again See the Note about fast f
  • 脚本可以编辑受保护的范围或工作表吗?

    我正在使用一个脚本来复制和粘贴一些数据 这些数据由几个用户填充 而没有权限仅编辑一行 其他范围受到这些用户的保护 无法编辑 该脚本将数据从一张纸复制到另一张纸 并且两张纸都受到完全保护 除了可以编辑任何内容的两个编辑者之外 当没有人处理此电
  • 将嵌入式 Glassfish 与 Maven 结合使用

    有人知道嵌入式 Glassfish 吗 我想运行一些 EJB 测试 但我不想每次运行测试时都启动和停止嵌入的 glassfish 根据插件文档 我应该将其放入 POM 中
  • 在移动设备上部署 C++ QML 插件的正确方法是什么?

    我经常使用 Box2D QML 插件 看起来效果非常好 但是 我想在 Android SGS2 上部署我的示例应用程序 但我似乎无法让它工作 无论我尝试在 AVD 上还是在设备上运行它 它都不起作用 androiddeployqt 成功完成