在Android应用程序中本地使用Qt类

时间:2016-01-20 10:05:19

标签: qt

我即将开发的Android应用程序具有Java中的UI和C ++中可通过JNI访问的非UI功能。 C ++代码使用一些非UI Qt类。我想我会在JNI_OnLoad中生成一个主要实例化并运行QCoreApplication的线程。任何后续的JNI调用都只会将事件发布到此线程。这可能吗?问候。

1 个答案:

答案 0 :(得分:0)

你想要做的事情肯定是可能的,但比起初看起来要困难一些。

如果你在Qt中端到端构建你的应用程序,那么你可以从他们的框架中免费获得许多功能,这些功能允许它在Android上运行,并且很多功能/管道都包含在他们的UI中。因此,如果您没有使用他们的UI,那么您需要做额外的工作。

在Android上,他们的UI框架基本上创建了一个本机Activity,然后将该活动用作应用程序的包装器。如果你看一下UI的低级源代码,那就是在Android上发生了什么,它是什么让Qt应用程序可以访问本地资源,网络,操作系统设施等。

如果没有Activity包装器,您的应用程序将只能执行简单的内存操作,不需要操作系统,文件系统或网络访问,也无法使用其他Qt库(例如Qt5Sql) ,Qt5Core等。)

以下是我们在java应用程序中使用它所需要做的事情:

  1. 创建一个代理包装器,用于共享基础的Qt 你的应用程序的上下文。
  2. 创建QtActivityDelegate。
  3. 使用原生Qt android设置代理活动和委托 库。例如QtNavite.setActivity。
  4. 使用相同的原生Qt安卓库实例化并设置DexClassLoader。
  5. 使用System.loadLibrary(..)加载任何Qt库。请注意,库已经存在于文件系统中。这部分对我们来说是一个巨大的痛苦。
  6. 对于您的Qt代码,请确保编写了正确的包装器,以便可以通过jni使用它们。我们最终使用swig为我们的代码自动生成java包装器 您可以在此处找到有关swig的更多信息:http://swig.org/

    毕竟,你应该能够在原生Android应用程序中使用你的Qt类/库。

    痛苦但绝对可能!