Qt on Android Episode 6(翻译)

原文链接:http://www.kdab.com/qt-android-episode-6/,Aprile 16, 2015 by BogDan Vatra

译者foruok,转载请保留出处。


Qt on Android Episode 5中我们学习了用Qt的方式在Android上使用JNI的基本知识。这次,我想把重点放在那些(当我们使用JNI扩展Qt on Android应用时)可以帮助我们提高生产率的工具上。

使用外部IDE来管理Java文件

不幸的是,Qt Creator对Java的支持非常有限,因此,为了更有效率,我们需要使用一个外部的IDE来更方便地扩展和调试我们应用的Java部分。

Android有两个强大的IDE:

  • Android Studio
  • Eclipse(最近不被推荐了)

本文将只关注 Android Studio。

但在我们讨论工具之前,让我们检查一下我们项目中的与Android相关的文件。

正如我在第一篇文章里说过的,Qt on Android应用都有两大部分:

  • 原生部分,就是你的C/C++/Qt代码,被编译成so文件
  • Android相关的部分:
    • Android清单文件
    • Android构建系统文件
    • 两个Java类,用来加载你应用的依赖库、你写的应用so文件以及启动应用
    • Ministro服务的.aidl文件和其他的资源文件,如assets、strings、images等

为了构建你的Android应用程序包(在episode 3学过),所有Android相关的文件都是必须的。但这些文件在哪儿呢?为什么当你点击“Create Templates”按钮时(参考下图)只有少数几个文件被拷贝到你的源文件目录里?
技术分享

好吧,Java文件,Ministro服务的.aidl文件以及一些资源文件被隐藏在你的Qt SDK里。我们不想把它们拷贝到你的源文件目录树里,是因为这两个原因:

  • 版本变化时我们可能改变它们并且破坏兼容性。如果他们是你项目的一部分,那它们就不可能更新,你的应用就会运行得不正常(比如,Qt 5.4里的Java文件可能和Qt 5.5的不兼容)。
  • 我们不想让你改变它们,因为这些文件里的代码相当“高深”,很难解释和理解,如果改变它们就有可能破坏你程序的行为。如果你不改变它们,那你所有的应用就可以共享同样的文件,因此,真没必要拷贝它们。

在Qt 5.4之前,要扩展你应用的Java部分是相当复杂的,主要原因是你不能优雅地使用像Eclipse这种外部IDE的功能,比如语法高亮、代码自动完成、代码重构等。(译者注:我当时可是两边来回拷贝……)为了这些便利性,你必须手动从你的Qt SDK安装目录里拷贝所有的Java文件到你的应用源码目录,但正如我前面所说的,我们不想让你那么做,那唯一的方法就是本地拷贝并且不要把它们添加到你的SCM(译者注:源代码管理服务器)…

但从Qt 5.4开始,当我给Qt 5.4和Qt Creator 3.3添加了Gradle支持后,这种状况得以改变。(译者注:纳尼,还有这种福利!)Gradle是新近被推荐使用的Android构建系统,Android Studio就用它。使用Gradle,我们可以在继续隐藏所有这些文件的前提下,提供你从一个21世纪IDE中想要的一切便利性。所以,如果你计划扩展你应用的Java部分,强烈推荐拷贝Gradle文件到Android目录中,就像下图中那么做:

技术分享

除了AndroidManifest.xmlres/values/libs.xml文件,向导还会拷贝下列文件:

  • build.gradle - Android Studio需要的项目文件
  • gradlew[.bat] - 构建脚本,用来构建Java部分,创建最终的APK。
  • gradle/wrapper/* - 构建脚本封装文件

build.gradle非常重要,它可以让你非常方便的给你的项目添加依赖。

举个例子,要向你的应用里添加 PlayServices ,你只需要这么做:

dependencies {
  ...
  compile ‘com.google.android.gms:play-services:7.0.0‘
}

想进一步了解build.gradle,看这个页面

Qt应用怎样使用Android Studio

Android Studio只用来干这些事儿:

  • 打开Gradle项目
  • 创建、编辑Java文件
  • 调试Java部分

Android Studio不能用来运行你的Qt应用,你还是得使用Qt Creator来运行你的应用!

让我们来看看怎么导入你Qt应用的Java部分,以及怎么调试。

核心步骤非常简单:你只需打开已有的build.gradle项目文件。参考下图:

技术分享

警告:Qt 5.4.0的用户应该用Qt 5.4.1及以后的版本更新gradle文件(再次点击“Create templates”按钮,并且只覆盖gradle文件)。这一步是必须的,因为Qt 5.4.0用了一个较旧的Gradle插件,在我们发布5.4.0后,Google又一次放弃兼容旧版本的Gradle插件,Android Studio拒绝导入Qt 5.4.0的项目。

今天我们要学的最后一件事是怎么用Android Studio调试Java部分。遵循下面这些步骤:

  • 设置断点
  • 附加调试器(Run->Attach debugger to Android process)
  • 用Qt Creator运行应用
  • 等待应用启动(你应该可以再附加调试器对话框中看见它)
  • 选择应用
  • 点击OK按钮

最后一步结束后,你的应用执行到断点时会被Android Studio停下来。当我们想调试的地方非常靠前(译者注:很接近Activity启动)时会遇到一些问题。为了解决这个问题,我们可以用 Debug.waitForDebugger() 函数。

下面是我们定制过的 onCreate 函数:

@Override
public void onCreate(Bundle savedInstanceState)
{
    Debug.waitForDebugger();
    // ....
    super.onCreate(savedInstanceState);
}

现在应用会等在那里知道一个调试器附加到它上面,然后它才接着运行。

现在我们已经学习了JNI的基础和如何使用外部工具来创造甜蜜生活(玫瑰人生),在下一篇文章里,我们将会讨论Qt on Android应用结构:怎样扩展Qt应用的Java部分,用一个实际生活中的Android例子来演示怎样正确地从Qt线程安全地调用Android UI(还有它的反面)。(译者注:真正的福利啊,这块是最让人头疼的啦。)


我翻译的Qt on Android Episode系列文章:

我开通了微信订阅号“程序视界”,关注即可第一时间看到我的原创文章以及我推荐的精彩文章:

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。