我眼中的Qt for Android
引子
前几天,我分享了一下qt for android,从大家的反应和回馈,我看到两种极端的状态。一个是:“太好了!想做Android开发但是不想转java,这下不用了!” 另一个是:“不要在Qt上浪费时间了,它顶多在Android上跑个Hello world,别的什么也跑不了。”我先说说我对Qt for Android的客观认识。首先,从现有阶段看,不得不承认TA并不是一个成熟的技术(工具)。在大型项目中,还是不建议使用qt for android开发的,因为资料太少,我们无法快速深入的在大脑建立起qt for android网络,在遇到问题的时候,解决起来就很棘手。但是,绝不是说仅仅就能跑个Hello world,如果真的这么一无是处,TA就没有存在的意义,也就不会吸引大批开发者深入研究和优化了。要知道,世上最简单的事情就是批评和怒斥。我再次强调一下,我只是分享我所看到的知道的,不带任何向导性。对于技术本身, 仁者见仁,智者见智。
品味与探究
当我看到这么一个技术工具,我的好奇心驱使我探究一下(1)TA到底是如何实现的,(2)程序在Android上执行效率和性能怎么样,(3)较常规的Android java开发和jni c++开发而言,两者之间有什么可以相互借鉴, (4)倘若Google真的开放纯c++开发,那么java和qt for android又是怎样的一番光景?一个开发者分享他某一个程序的设计思路:在Qt下通过jni得到java Env,从而使用GPS等android API,并且已经实现:
JNIEnv *currEnv;
currEnv = 0;
if (currVM->AttachCurrentThread((void **)&currEnv, NULL)<0)
{
emit error("Cannot attach the current thread to the VM");
}
也许因为我对Qt信号和槽的情有独钟,看到emit就感到很亲切,并且被深深的吸引了。那么从Qt for android 的qt工程源码看,到底是如何在android上成功启动并运行的呢?
启动流程分析
用qt-creator创建的每个应用程序中,src下的文件都是基本相同。因为启动程序,创建接口,链接库,这些操作是每个应用程序所必需的,最初的qt程序被编译成了lib**.so的动态库,当调用JNI接口startQtApp函数时真正启动了qt程序。执行程序的入口在src/eu/licentia/necessitas/industrius/QtActivity.j