2016-01-20 16 views
0

我即将开发的Android应用程序具有Java中的用户界面以及可通过JNI访问的C++中的非UI功能。 C++代码使用一些非UI Qt类。我想我会在JNI_OnLoad中产生一个线程,它基本上会实例化并运行QCoreApplication。任何后续的JNI调用都只会将一个事件发布到该线程。这可能吗?问候。在Android应用程序中本地使用Qt类

+0

我认为这是。老实说,你的问题并不是一个真正的问题。你为什么不通过构建一个示例项目来测试它? – sashoalm

回答

0

你想要做的事绝对有可能,但比起初看起来要困难得多。

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

在Android上,他们的UI框架基本上创建了一个本地活动,然后使用该活动作为应用程序的包装。如果你看看他们的UI的低级来源,那就是Android上发生的事情,它允许Qt应用程序访问本地资源,网络,操作系统设施等。

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

下面是我们必须做的,使这项工作在我们的Java应用程序:

  1. 创建一个代理包装活动为Qt来使用与您共享应用程序的基础 上下文。
  2. 创建一个QtActivityDelegate。
  3. 使用本机Qt库设置代理活动和委托。例如QtNavite.setActivity。
  4. 使用相同的本机Qt android库实例化和设置DexClassLoader。
  5. 使用System.loadLibrary(..)加载任何Qt库。请注意,这些库必须已经存在于文件系统中。这部分对我们来说是一大痛苦。

对于你的Qt代码,请确保你有正确的包装,以便他们可以通过jni使用。我们最终使用swig为我们的代码自动生成java包装器。
你可以找到更多关于痛饮这里:http://swig.org/

一切,你应该能够使用你的Qt类/库从原生Android应用程式中后。

痛苦但绝对有可能!

相关问题