原文链接: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.xml和res/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系列文章:
- Qt on Android Episode 1
- Qt on Android Episode 2
- Qt on Android Episode 3
- Qt on Android Episode 4
- Qt on Android Episode 5
我开通了微信订阅号“程序视界”,关注即可第一时间看到我的原创文章以及我推荐的精彩文章: