【问题标题】:How to integrate Qt library inside Android native project如何在 Android 原生项目中集成 Qt 库
【发布时间】:2019-08-12 12:27:18
【问题描述】:

我是一名原生 Android 开发人员,一位客户要求我在原生 Android 应用程序中重用他的 Qt 库项目。我是 Qt 开发的新手,我的意思是,我了解 C/C++,但从未处理过 Qt 开发本身,无论是环境还是部署方法。

我一直在研究这些解决方案,但我离创建一个带有 Qt 库的 Android 项目还有很长的路要走。

类似的解决方案:

我的问题:如何将我的 Qt 项目导出为我的 Android 项目可用的格式?任何分步指南将不胜感激。

谢谢!

【问题讨论】:

  • Qt库是什么样的库?请注意,Qt 旨在运行自己的事件循环,任何有趣的事情都需要它,以及现有的 QCoreApplication 实例您应该从简单开始,创建一个 Qt 库,例如,它只运行一个计时器并与您的应用每秒一次或其他。这不是很多行 Qt 代码。集成后,您可以尝试使用更复杂的库。
  • 它是一个通信协议库,它根据某些参数生成帧,当处理接收到的帧时,它会解析帧并返回一个“可理解的”响应/参数。所以,是的,好点,但仍然需要弄清楚项目的设置。谢谢!

标签: android qt qt5 shared-libraries


【解决方案1】:

假设您的 Qt 应用程序仅用于其逻辑(而不是 GUI 端),您需要它做什么:

将 JNI 添加到 Android 的 Qt 库中

JNI(Java 原生接口)允许创建一个接口来链接和使用来自 Java 的原生 (C++) 代码。这用于包装您的 C++ 代码并提供直接从您的 Android 应用程序可见和可用的函数

  • 使用 Qt 的在线安装程序为 Android 安装所需的 Qt 版本(选择所需 Qt 版本时的复选框)
  • 创建一个 JNI 接口以允许您的应用程序和库进行通信。该示例涵盖了这一点:https://developer.android.com/ndk/samples/sample_hellojni。我可能会建议创建另一个 C++/JNI 库作为 C++/Qt 库的包装器。这样您就不会使用 JNI 依赖项污染原始库。

将您的 JNI 库集成到您的应用程序中

一旦有了 JNI 接口,您就必须交叉编译该库并将其与您的 Android 应用程序一起发布

  • 从 Android Studio 构建您的本机库(在指向您的 Qt 库并包含目录之后)。或者,您可以从 Qt Creator 手动构建它(稍微容易一些)并仅导入生成的 .so。但是,如果您的 Qt 库发生更改,那将是痛苦的
  • 打包库 (.so),并在应用程序启动时加载它。这也包含在示例中。加载库后,在进行一些转换工作后,您将能够使用您公开的 JNI 函数并传递参数。您的 Android 应用还可以将句柄传递给本机库,从而实现双向通信。

注意事项

  • 注意项目的许可。与没有 Android 的 LGPLv3 相比,Android 的交叉编译 Qt 可能会切换到其 GPLv3 或商业许可。
  • Qt 库必须包含在您的最终包中。因此,它们要么必须与您的原始库静态链接,要么动态链接并存储在您的 APK 中
  • 您可以利用 Qt JNI 类来更轻松地创建接口,但这不是必需的:https://doc.qt.io/qt-5/qandroidjniobject.html
  • 线程可能会变得困难,因为对 JNI 的调用/从 JNI 调用必须从主线程运行

如果您找到一个工作示例,我建议您从一个工作示例开始,因为整个设置肯定需要一些时间。我不知道一个完整的教程,如果你找到了,请随时分享!

【讨论】:

  • 哇,谢谢,现在有很多事情需要处理和尝试。感谢您的回答,这是我目前在任何地方都没有看到的记录。如果我发现了什么,我会告诉你的!