使用Java函数和第三方库在Qt for Android中的本地化

13

最近我使用Qt编写了一个Android应用程序。
但我有一个大问题,我能否使用/调用一些原生的Android API,例如调用特定活动?

例如,在Android SDK中,我在Java中调用联系人:
Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent,PICK_CONTACT);

是否存在某些C++包装器库可以使用Java Android SDK API?

或者如果我需要某些特殊的组件(已使用Java编写),我可以在我的Qt Android程序中使用它吗?
或者创建一个由“纯Qt”和“标准Java”或“C ++ Android NDK”混合的页面/活动的程序?

(我提出这个问题是因为我有使用MOSYNC框架的经验,那是一个不错的框架,但你被限制在其自己的库中,无法使用任何外部库或Android标准API。...)

谢谢。

编辑: 根据JNI的改进( http://qt-project.org/doc/qt-5/qtandroidextras-index.html),我有一个问题: 我是否可以在我的Qt项目中使用“任何”Android Java第三方库?就像在Java SDK项目中使用那些库一样?


2
QT使用Android NDK,它应该有一个包装函数,对吧? - Sebastian Lange
1
是的,Sebastian。NDK有,但这并不意味着QT也有一个包装器来使用Android SDK/NDK。 - hich9n
2
Eclipse的评论似乎相当主观。为什么在与所提出的问题相关的情况下,Android开发最好在Eclipse中进行?使用Eclipse如何比使用其他任何IDE更容易解决所提出的问题? - Jerry Jeremiah
1
我刚刚发现了从 Android 应用程序调用 Java 代码的示例:http://qt-project.org/doc/qt-5/qtandroidextras-notification-example.html - Michal Fapso
1
我认为这个问题可以被打开。@sashoalm - hich9n
显示剩余2条评论
3个回答

9
为了实现你想要的功能,需要通过JNI从C++代码调用Java代码。我不知道有任何C++封装库可以做到这一点。您需要从JNI_OnLoad获取Java虚拟机,并在要调用Java方法时将VM附加到您的线程中,以获得JNIEnv,您可以使用它来查找所需的类并对其进行方法调用。 这个链接 应该会帮助你了解细节。 至于是否值得使用QT来开发Android应用程序,如果您需要跨平台支持并且希望将同一应用程序部署到Android、Linux、Windows等平台上,则是的。但是,根据我的经验,如果您只开发Android应用程序,则直接使用Android会更容易和更快速。

3
我不确定您如何进行“Qt for Android”。但是此时,这个想法已经得到KDE团队(K桌面环境)的官方支持。他们称其为KDE Necessitas项目。并且他们在2012年10月发布了该项目的第一个beta版本。 因此,当您安装Necessitas SDK时,可能会安装以下内容。
  1. Qt Creator - 用于Android的定制Qt IDE。
  2. Android NDK - 用于将Qt代码构建为共享对象。
  3. Android SDK - 定制了Qt支持。
使用定制的Qt Creator,您可以:
  1. 创建Android UI项目。
  2. 在集成的Qt Designer中设计UI。
  3. 编译C++代码以构建.so文件,并将其与Java代码一起包装。
  4. 创建APK并部署。
  5. 调试APK。
我对Qt for Android的一个主要关注点是UI方面。UI具有KDE 4.x(在桌面上运行的相同)的本地外观和感觉。Android UI主题(Holo等)尚未完全可用。 由于这个项目仍处于测试版阶段,我不确定Android原生特性的包装器类/函数是否可用。请查阅官方文档以获取更多详细信息。 希望这可以帮到你。

谢谢@gnuanu,实际上我问这个问题是为了获得官方提及! - hich9n

-1

你可以使用Android NDK来编写C/C++程序。你需要将你的c++代码库封装在一个静态库中,并通过Java包装器和JNI加载它。

标准的NDK不支持RTTI,许多标准c++的功能也不可用,例如std::string等。为了解决这个问题,你可以重新编译NDK。Dmitry Moskalchuk提供了一个修改版的NDK,支持这一点,网址为http://www.crystax.net/android/ndk-r3.php。这个修改版适用于所有运行在ARM处理器上的Android手机。

注意:JNI调用可能会大大降低性能。不过,如果你知道如何在C/C++中编程,Java并不难。Java的优点是应用程序可以在任何运行Android的设备上运行,而NDK应用程序则取决于它编译的架构。


2
NDK支持RTTI、异常和STL。请参见:http://developer.android.com/tools/sdk/ndk/index.html - Frohnzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,