如何在Android原生项目中集成Qt库
我是一名本地Android开发人员,一位客户要求我在本地Android应用程序中重新使用他的Qt库项目。我对Qt开发非常陌生,我的意思是,我了解C/C++但从未处理过Qt开发本身,无论是环境还是部署方法 我一直在研究这些解决方案,但我没有更接近于创建一个Android项目,其中有一个Qt库,我可以与之交互 类似的解决方案:如何在Android原生项目中集成Qt库,android,qt,qt5,shared-libraries,Android,Qt,Qt5,Shared Libraries,我是一名本地Android开发人员,一位客户要求我在本地Android应用程序中重新使用他的Qt库项目。我对Qt开发非常陌生,我的意思是,我了解C/C++但从未处理过Qt开发本身,无论是环境还是部署方法 我一直在研究这些解决方案,但我没有更接近于创建一个Android项目,其中有一个Qt库,我可以与之交互 类似的解决方案: 我的问题:如何将Qt项目导出为Android项目的可用格式?如果您能提供详细的指导,我们将不胜感激 谢谢 假设您的Qt应用程序仅用于其逻辑(而不是GUI端),您需要它
谢谢 假设您的Qt应用程序仅用于其逻辑(而不是GUI端),您需要它做什么: 将JNI添加到Android的Qt库 JNI(Java本机接口)允许创建一个接口来链接和使用来自Java的本机(C++)代码。它用于包装C++代码,并提供从Android应用程序直接可见和可用的函数。
- 使用Qt的在线安装程序为Android安装所需的Qt版本(选择所需的Qt版本时会出现一个复选框)
- 创建一个JNI接口,以允许应用程序和库进行对话。该示例中包含了这一点:。我可能会建议创建另一个C++/JNI库作为C++/Qt库的包装器。这样,您就不会用JNI依赖项污染原始库
- 从androidstudio构建您的本机库(在指向您的Qt库并包含dir之后)。或者,您可以从Qt-Creator手动构建它(稍微容易一点),并只导入结果
。但是,如果您的Qt库发生变化,这将是痛苦的。so
- 打包库(
),并在应用程序启动时加载它。这也包含在样本中。加载库后,在进行一些转换工作后,您将能够使用公开的JNI函数并传递参数。您的Android应用程序还可以向本机库传递一个句柄,允许以两种方式进行通信.so
- 请注意项目的许可。针对Android的交叉编译Qt可能会转向其GPLv3或商业许可证,而不是没有Android的LGPLv3
- Qt库必须包含在最终包装中。因此,它们要么与原始库进行静态链接,要么动态链接并存储在APK中
- 您可以利用Qt JNI类简化接口的创建,但这不是必需的:
- 线程可能会变得困难,因为对JNI的调用/来自JNI的调用必须从主线程运行
如果您找到一个工作示例,我建议您从一个工作示例开始,因为整个设置肯定需要一些时间。我不知道有没有完整的教程涵盖这一点,但是如果你找到了,请随意分享 假设您的Qt应用程序仅用于其逻辑(而不是GUI端),您需要它做什么: 将JNI添加到Android的Qt库 JNI(Java本机接口)允许创建一个接口来链接和使用来自Java的本机(C++)代码。它用于包装C++代码,并提供从Android应用程序直接可见和可用的函数。
- 使用Qt的在线安装程序为Android安装所需的Qt版本(选择所需的Qt版本时会出现一个复选框)
- 创建一个JNI接口,以允许应用程序和库进行对话。该示例中包含了这一点:。我可能会建议创建另一个C++/JNI库作为C++/Qt库的包装器。这样,您就不会用JNI依赖项污染原始库
- 从androidstudio构建您的本机库(在指向您的Qt库并包含dir之后)。或者,您可以从Qt-Creator手动构建它(稍微容易一点),并只导入结果
。但是,如果您的Qt库发生变化,这将是痛苦的。so
- 打包库(
),并在应用程序启动时加载它。这也包含在样本中。加载库后,在进行一些转换工作后,您将能够使用公开的JNI函数并传递参数。您的Android应用程序还可以向本机库传递一个句柄,允许以两种方式进行通信.so
- 请注意项目的许可。针对Android的交叉编译Qt可能会转向其GPLv3或商业许可证,而不是没有Android的LGPLv3
- Qt库必须包含在最终包装中。因此,它们要么与原始库进行静态链接,要么动态链接并存储在APK中
- 您可以利用Qt JNI类简化接口的创建,但这不是必需的:
- 线程可能会变得困难,因为对JNI的调用/来自JNI的调用必须从主线程运行
如果您找到一个工作示例,我建议您从一个工作示例开始,因为整个设置肯定需要一些时间。我不知道有没有完整的教程涵盖这一点,但是如果你找到了,请随意分享 什么样的库是Qt库?请注意,Qt是为运行自己的事件循环而设计的,任何有趣的事情都需要创建一个Qt库,例如,只运行一个计时器并每秒与您的应用程序通信一次,以及现有的
QCoreApplication
实例。Qt c的行数不多