如何在Android原生项目中集成Qt库

问题描述 投票:0回答:1

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

我一直在研究这些解决方案,但是我没有接近能够创建一个带有Qt库的Android项目,我可以与之交互。

类似方案:

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

谢谢!

android qt qt5 shared-libraries
1个回答
2
投票

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

将JNI添加到Android的Qt库中

JNI(Java Native Interface)允许创建用于链接和使用Java的本机(C ++)代码的接口。这用于包装您的C ++代码,并直接从您的Android应用程序提供可见和可用的功能

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

在您的应用程序中集成JNI库

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

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

笔记

  • 小心您的项目许可。 Android的交叉编译Qt可能会转换为其GPLv3或商业许可证,而不使用Android的LGPLv3。
  • Qt库必须包含在最终包中。它们是否必须与原始库静态链接,或动态链接,并存储在APK中
  • 您可以利用Qt JNI类来简化界面的创建,但这不是必需的:https://doc.qt.io/qt-5/qandroidjniobject.html
  • 线程可能变得困难,因为来自JNI的调用必须从主线程运行

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

© www.soinside.com 2019 - 2024. All rights reserved.