【问题标题】:[ Native ]: Using Java functions & 3rd-party libraries in Qt for Android [closed][ Native ]: Using Java functions & 3rd-party libraries in Qt for Android [closed]
【发布时间】:2013-08-05 20:22:12
【问题描述】:

最近用qt写了一个android app。
但是我有一个大问题,我可以使用/调用一些原生的android API,比如调用特殊活动吗?

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

是否有一些用于 java android sdk API 的 c++ 包装库?

或者如果我需要一些特殊的组件(用 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 项目中使用这些库时?

【问题讨论】:

  • QT用的是android NDK,应该有一个wrapper函数吧?
  • 是的 sebastian,NDK 有,但这并不意味着 QT 也有使用 android sdk/ndk 的包装器。
  • Eclipse 评论似乎很主观。就所提出的问题而言,为什么 Eclipse 中的 Android 开发最好?与使用任何其他 IDE 相比,使用 Eclipse 会如何使被问到的问题更容易解决?
  • 我刚刚发现了这个从 Android 应用程序调用 Java 代码的示例:qt-project.org/doc/qt-5/…
  • 我觉得这个问题可以打开。 @sashoalm

标签: android qt mosync


【解决方案1】:

我不确定您如何继续使用“Qt for Android”。但在这个时间点,这个想法得到了KDE团队(K桌面环境)的官方支持。他们称之为KDE Necessitas 项目。他们已于 2012 年 10 月发布了该项目的第一个测试版。

所以基本上,当您安装 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,实际上我问这个问题是为了获得官方提及!
【解决方案2】:

为了做你想做的事,你需要通过 JNI 从你的 C++ 代码中调用 Java 代码。我不知道任何 C++ 包装库。您将需要从 JNI_OnLoad 获取 Java VM,并且当您想要调用 Java 方法时,您需要将 VM 附加到您的线程,并为您提供 JNIEnv,您可以使用它来查找所需的类并调用方法在上面。 This link 应该可以帮助您了解详细信息。

至于使用QT开发Android应用是否值得,是的,如果你需要跨平台支持,并且想将相同的应用部署到Android、Linux、Windows等。如果你只是开发Android应用,那么根据我的经验,直接使用 Android 会更容易、更快捷。

【讨论】:

    【解决方案3】:

    您可以使用 Android NDK 在 C/C++ 中进行编程。您必须将您的 c++ 代码库包装在一个静态库中,并通过 Java 包装器和 JNI 加载它。

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

    注意:JNI 调用会大大降低您的性能。 Java 并不难——如果你知道如何用 C/C++ 编程的话。 Java 的优势在于应用程序可以在任何运行 Android 的设备上运行,因为 NDK 应用程序依赖于编译它的架构。

    【讨论】:

    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多