原地址:http://blog.csdn.net/foruok/article/details/17796017

今天为了测试使用 Qt Creator 3.0.0 开发的纯 C 工程,利用了 Windows 下 Qt 5.2 for Android 开发入门里创建的 HelloAndroid 工程,想把纯 C 工程生成的 so 库加到 HelloAndroid 工程中。结果加入进去了,但不会自动拷贝到生成目录打包进 APK 。

研究了一个小时,大体搞明白了 Qt Creator 生成 APK 的流程。

首先 Qt Creator 会编译时会生成一个 json 文件,就在工程目录下,我的是 android-libhelloAndroid.so-deployment-settings.json 。内容如下:

  1. {
  2. "description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
  3. "qt": "C:\\Qt\\Qt5.2.0\\5.2.0\\android_armv7",
  4. "sdk": "E:/android-sdk-windows",
  5. "ndk": "E:\\Android\\android-ndk-r8d",
  6. "toolchain-prefix": "arm-linux-androideabi",
  7. "tool-prefix": "arm-linux-androideabi",
  8. "toolchain-version": "4.7",
  9. "ndk-host": "windows",
  10. "target-architecture": "armeabi-v7a",
  11. "android-extra-libs": "libhttpclient_test.so",
  12. "application-binary": "E:/qt/helloAndroid/libhelloAndroid.so"
  13. }
  1. {
  2. "description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
  3. "qt": "C:\\Qt\\Qt5.2.0\\5.2.0\\android_armv7",
  4. "sdk": "E:/android-sdk-windows",
  5. "ndk": "E:\\Android\\android-ndk-r8d",
  6. "toolchain-prefix": "arm-linux-androideabi",
  7. "tool-prefix": "arm-linux-androideabi",
  8. "toolchain-version": "4.7",
  9. "ndk-host": "windows",
  10. "target-architecture": "armeabi-v7a",
  11. "android-extra-libs": "libhttpclient_test.so",
  12. "application-binary": "E:/qt/helloAndroid/libhelloAndroid.so"
  13. }

上面文件里的 application-binary ,实际上是一个 so 文件,在我这里是 libhelloAndroid.so 。

要说明的是,编译阶段只会生成 so 文件,什么事情不干。当你运行时,选择了 Android 设备,Qt Creator 才开始执行一系列动作来生成 APK ,并 push 到设备上运行。大概步骤是这样的:

  1. 创建构建目录
  2. 拷贝 application-binary
  3. 拷贝 Qt 自己的库和依赖的库,如 libgnustl_shared.so 等。
  4. 根据模板拷贝 java 文件、生成 AndroidManifest.xml 、资源文件等等
  5. 调用 ant 编译、打包、签名、对齐
  6. 连接设备,install APK 并运行

这些动作都是由一个名为 androiddeployqt.exe 的程序完成的,感兴趣的可以看它的源码,Qt SDK 里有,同时也可以在 Qt Creator 的输出 panel 中看到 这个部署程序的输出信息。更详细的过程可以参考 Qt 官方文档 Deploying Applications to Android Devices,那里面说得很详细。

说说我遇到的问题。我在 pro 文件里使用 LIBS += -lxxx 加入了我的 C 库,编译通过,可是 androiddeployqt 没有拷贝 libxxx.so ,APK 运行时找不到依赖的 libxxx.so 直接挂掉了。这个问题的解决,只要添加一个额外的依赖库就可以了,Qt Creator 会传递参数给 androiddeployqt ,后者就会正确打包。

在 Qt Creator 中,选则 Projects > Run > Deploy configurations > Details ,可以看到下面的界面:

看图片上画蓝线、篮圈的地方,就是这里,添加你依赖的库即可。

好啦,到这里我们可以在纯粹 C++ 的 IDE 当中进行 Android
的开发了,带界面的、不带界面的,都可以完成。不过貌似 service 还不行,这个我还没有研究。

Qt for Android 部署流程分析的更多相关文章

  1. 【转】android SystemUI 流程分析

    android4 SystemUI 流程分析 什么是SystemUI? 对于Phone来说SystemUI指的是:StatusBar(状态栏).NavigationBar(导航栏).而对于Tablet ...

  2. Android 启动流程分析

    原文:https://www.jianshu.com/p/a5532ecc8377 作者曾经在高通的Android性能组工作,主要工作是优化Android Application的启动时间. APP基 ...

  3. Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示

    Android 系统版本号非常多,较新的 4.4 ,较老的 2.3 ,都有人用. Qt on Android 开发的 Android 应用.默认在 Android 设备上是非全屏的. 而有些应用的需求 ...

  4. 《Qt on Android核心编程》夹

    china-pub在售前,售中环节退房,折扣低! 有朋友想看看<Qt on Android核心编程>的文件夹,So-- 文件夹     <Qt on Android核心编程>文 ...

  5. Qt on Android: Android SDK安装

    之前我在 <Windows下Qt 5.2 for Android开发入门>一文中介绍了 Windows 下 Qt on Android 开发环境的搭建,略过了 Android SDK 的安 ...

  6. Qt on Android:将Qt调试信息输出到logcat中

    版权全部 foruok .如需转载敬请注明出处(http://blog.csdn.net/foruok). 假设你在目标 Android 设备上执行了 Qt on Android 应用,你可能希望看到 ...

  7. Qt on Android:资源文件系统qrc与assets

    使用 Qt 为 Android 开发应用时,有时我们的应用会携带一些资源文件,如 png . jpg 等,也可能有一些配置文件,如 xml 等.这些文件放在哪里呢? 有两种方式: qrc assets ...

  8. Qt on Android: http下载与Json解析

    百度提供有查询 ip 归属地的开放接口,当你在搜索框中输入一个 ip 地址进行搜索,就会打开由 ip138 提供的百度框应用,你能够在框内直接输入 ip 地址查询.我查看了页面请求,提取出查询 ip ...

  9. Android平台APK分析工具包androguard的部署使用和原理分析

    原创文章,转载请注明出处,谢谢. Android应用程序分析主要有静态分析和动态分析两种,常见的静态分析工具是Apktool.dex2jar以及jdgui.今天突然主要到Google code上有个叫 ...

随机推荐

  1. CoreAnimation (CALayer 动画)

    CoreAnimation基本介绍: CoreAnimation动画位于iOS框架的Media层 CoreAnimation动画实现需要添加QuartzCore.Framework CoreAnima ...

  2. Unity KillCount

    using UnityEngine; using System.Collections; public class KillCountMult : MonoBehaviour { public GUI ...

  3. 【Web】CXF WebService 服务端和客户端 环境搭建及测试

    cxf服务端 1.去官方下载对应的jar包:http://cxf.apache.org/ 2.maven配置相应jar包 3.修改web.xml,完成spring和cxf配置 <!-- Spri ...

  4. c++子类和父类成员函数重名

    子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数. 子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名 ...

  5. tabbar动画切换

    效果1: UIViewController *vc = self.viewControllers[self.selectedIndex]; CATransition *animation =[CATr ...

  6. c语言‘\0’ ,‘0’, “0” ,0之间的区别

    首先比较一下‘\0’和‘0’的区别.有一个共同点就是它们都是字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节.请翻开你的ASCII字符集表吧,一般在你的C语言教材的附录上, ...

  7. svn笔记4属性Properties

    我们已经详细讲述了Subversion存储和检索版本库中不同版本的文件和目录的细节,并且用了好几个章节来论述这个工具的基本功能.如果对于版本化的支持到此为止,从版本控制的角度来看Subversion已 ...

  8. UNIX环境高级编程——网络基础概念

    TCP协议分成两个不同的协议: 1.网络传输中差错的传输控制协议TCP 2.专门负责对不同网络进行互联的互联网协议IP 网络体系结构概念: 网络体系结构即是指网络的层次结构和每层所使用协议的集合 OS ...

  9. hdu1248

    Problem Description 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡 ...

  10. #define DEBUG用法

    背景: 很多时候我们写代码,想要看看函数或者算法执行的对不对.是否达到了我们想要的效果, 那么,最直接的办法是把函数或者算法所操作数据显示出来看看,这样就需要写一些cout<<直接输出的代 ...