Android平台Qt开发入门教程

米狗族 发布于 2011/01/16 14:45
阅读 20K+
收藏 20

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

很多人会问,Android平台可以不使用Java开发应用程序??

我做Android平台native开发之前,也有这么想过,但是我又想,底层系统全是c/c++代码,用c/c++开发Android平台程序是可能 的,只是需要使用系统非公开的API(就是android源代码,而非NDK里面提供的头文件),比如libui和skia。

好了,由于我的工作是把C++中间件移植到Android平台,所以会对Qt for android这个项目比较了解,毕竟国内做这些的还比较少,所以需要参考android-lighthouse如何解决的文字显示,图形,键盘,触摸屏事件等等。

言归正传,我们开始今天的教程: 在Android平台开发Qt应用程序。

前提:

  • 你的系统必须是linux,或者MAC OS X。在windows平台使用cygwin开发会遇到问题。
  • 你首先需要下载android-ndk-r5或以上版本,android-sdk-r8或以上版本。
  • 然 后下载好android-lighthouse, 这个就是android平台的Qt版本,国外个人移植的,nokia官方是不会发布这样的版本的。git软件库地 址:git://gitorious.org/~taipan/qt/android-lighthouse.git
  • 当然你还可以下载 整合了android平台的qtcreator, 软件库地址:git://gitorious.org/~taipan/qt-creator/android-qt-creator.git  这样你 可以直接在qtcreator里面开发测试android应用程序,这里有个视频介绍qtcreator开发android应用程序(被墙了,可以用 VPN或proxy访问): http://www.youtube.com/watch?v=VU_zPnQrM6E


下载,编译android-lighthouse:

  • 打开终端,输入"git clone git://gitorious.org/~taipan/qt/android-lighthouse.git",便开始下载android- lighthouse的源码。下载好后,android-lighthouse目录结构如下图:

android-lighthouse source tree

  • 下载android-qtcreator, 在终端中输入"git clone git://gitorious.org/~taipan/qt-creator/android-qt-creator.git",开始下载;如果你不 想使用图形界面开发Qt应用程序,你可以不用下载,下面是我通过打包下载的qtcreator 2.1 for android的文件目录结构,压缩包总共21M.
  1. aries@uu3g:/wp/qt-creator-android-qt-creator$ ls
  2. dist  HACKING             LICENSE.LGPL   qtcreator.pro  scripts  src
  3. doc   LGPL_EXCEPTION.TXT  qtcreator.pri  README         share    tests
复制代码

 

  • 然后我们修改以下环境变量,开始编译android-lighthouse:


       1. androidconfigbuild.sh文件, 把ANDROID_NDK_ROOT, ANDROID_NDK_HOST, ANDROID_NDK_TOOLCHAIN_PREFIX等等这5个变量安装你下载的android-ndk进行修改,比如下面是我自己电脑上面设置的 变量:

  1. export ANDROID_NDK_ROOT=/opt/android-ndk-r5
  2. export ANDROID_NDK_HOST=linux-x86
  3. export ANDROID_NDK_TOOLCHAIN_PREFIX=arm-linux-androideabi
  4. export ANDROID_NDK_TOOLCHAIN_VERSION=4.4.3
  5. export ANDROID_NDK_PLATFORM=android-8
复制代码

       2. mkspecs/android-g++/qmake.conf文件,把NDK_ROOT, NDK_HOST,NDK_TOOLCHAIN_PREFIX, ANDROID_PLATFORM, NDK_TOOLCHAIN_VERSION按照你下载的android-ndk进行修改,比如我使用的是x86平台的android-ndk-r5(非 64位系统),我修改后的mkspecs/android-g++/qmake.conf文件如下图所示:
qmake.conf



  • 做好以上2个文件的修改后,我们就开始编译android-lighthouse,注意androidconfigbuild.sh最后 有一个make的指令,你可以去掉他,自己手动输入,或者现在修改,注意最好充分利用你的多核CPU,我2核的CPU,我就make -j2了,如果你是4核的,你最好make -j4,这样我想如果3GHz的CPU,最多1个小时就可以编译好android-lighthouse.修改好后,运行
  1. ./androidconfigbuild.sh
复制代码


       然后就等待结果,如果你设置的是手动输入make,你需要在config完成之后输入make自行编译。
       编译结束后,输入

  1. sudo mkdir /data/local/qt
  2. sudo make install
复制代码


       android-lighthouse默认会安装到/data/local/qt目录下。

安装qt动态库:

  • 手机:首先确保你的手机有足够大的空间安装这些动态库(全部安装需要200M的空间),其中QtXml有50M, QtGui有90M,QtCore有20多M。这些都是带调试信息的动态库。
  • 模拟器:模拟器默认启动会把分区大小设置为64M,这里是不够用的,我们需要手动设置分区大小,我这里设置为256M。首先用android list列出你的AVD列表,如下图

android avd list


        然后使用emulator -avd -partition-size 指定分区大小并启动模拟器,如下所示,我启动的是android2.2, 分区大小为256M的AVD:

  1. aries@uu3g:~$ emulator -avd android2.2 -partition-size 256
复制代码

在模拟器里面查看分区大小:
df in android emulator

 

  • 这里我们使用模拟器来做例子,使用adb -e push把所有Qt库push到模拟器中,你也可以使用android-lighthouse自带的脚本来完成这个任务,push_qt_libs.sh 脚本内容如下(注意修改你的push_qt_libs.sh里面的strip工具路径):
  1. #!/bin/sh
  2. adb shell rm -r /data/local/qt || exit 0
  3. rm -fr al
  4. mkdir al
  5. cp -a lib/*.so* al/
  6. /opt/android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip --strip-unneeded al/*
  7. adb push al /data/local/qt/lib
  8. adb push imports /data/local/qt/imports
  9. adb push plugins /data/local/qt/plugins
复制代码



运行Qt应用程序:

  • 以上步凑结束后,我们还需要修改一些shell脚本才可以正常的工作,android-lighthouse main trunk里面的shell脚本有一些bug,这里我们就动手开始改他, 在android-lighthouse根目录下面找到create_android_lighthouse_project.sh,打开,根据你 android-ndk的版本路径, 修改以下内容:
  1. ......
  2. #修改以下2行,指向你的android-sdk和android-lighthouse源码路径
  3. SDK_ROOT=/home/buus/dev/android-sdk-linux_x86
  4. LIGHTHOUSE_ROOT=/home/buus/dev/android-lighthouse
  5. ......
  6. #我的android-sdk里面,adb在platform-tools目录下面,所以修改为$SDK_ROOT/platform-tools/adb
  7. \$SDK_ROOT/tools/adb install -r bin/\$PROJECT_NAME-debug.apk
  8. ......
  9. #同上
  10. \$SDK_ROOT/tools/adb shell am start -n org.\$PROJECT_NAME.qt/.QtMain
  11. ......
  12. #同上
  13. \$SDK_ROOT/tools/adb install -r bin/\$PROJECT_NAME-debug.apk
复制代码


       这些路径设置好后,我们再修改一些可能存在的bug, 把此脚本中的如下代码

  1. cp $LIGHTHOUSE_ROOT/examples/android/QtAnimatedtiles/AndroidManifest.xml $J_PRO/AndroidManifest.xml
  2. cp -r $LIGHTHOUSE_ROOT/src/android/java/src/com $PROJECT_NAME-java/src
  3. sed -i "s/animatedtiles/$PROJECT_NAME/g" $J_PRO/AndroidManifest.xml
  4. cp \$Q_PRO/lib\$PROJECT_NAME.so* \$J_PRO/libs/armeabi     #我们编译cpp代码时是生成可执行文件,不是生成动态库
复制代码


       替换为

  1. cp $LIGHTHOUSE_ROOT/src/android/java/AndroidManifest.xml $J_PRO/AndroidManifest.xml
  2. cp -r $LIGHTHOUSE_ROOT/src/android/java/src/* $PROJECT_NAME-java/src
  3. cp -r $LIGHTHOUSE_ROOT/src/android/java/res/* $PROJECT_NAME-java/res
  4. sed -i "s/example.name/$PROJECT_NAME.qt/g" $J_PRO/AndroidManifest.xml
  5. sed -i "s/Application name/$PROJECT_NAME/g" $J_PRO/res/values/strings.xml
  6. cp \$Q_PRO/\$PROJECT_NAME \$J_PRO/libs/armeabi/lib\$PROJECT_NAME.so #我们编译cpp代码时是生成可执行文件,不是生成动态库,但这里必须以动态库的形式加载
复制代码

       修改这些主要是由于example里面的代码没有及时更新,并且我们还需要res里面的libs.xml文件,然后保存,这里有一份我修改好的,针对2011年1月份的trunk做的修改。
create_android_lighthouse_project.sh (5.49 KB, 下载次数: 0)

 

  • 以上步凑结束后,我们开始拷贝一个例子程序来开始我们的Qt for android之旅。拷贝examples/widgets/calculator整个目录到android-lighthouse根目录下面,然后使 用"create_android_lighthouse_project.sh"创建此c++代码对应的java代码,我们在终端里面运行
  1. ./create_android_lighthouse_project.sh -n calculator
复制代码

 

  • 命令结束后,会在当前目录产生calculator-cpp和calculator-java 2个目录,以及build.sh, creatorbuild.sh, run.sh等工具脚本。这里需要注意,calculator-cpp目录下面的源代码是stub程序,就是什么事情都不做作的代码,我们需要把这个目录下面的所有文件都删除掉,然后把calculator目录下面的所有文件拷贝到calculator-cpp目录下,然后再运行(在这里你的模拟器必须启动,或者手机已经正确连接上电脑了):
  1. ./build.sh
复制代码


        我执行以上几个步凑后的终端:

  1. aries@uu3g:/wp/android-lighthouse$ rm calculator-cpp/* -rf
  2. aries@uu3g:/wp/android-lighthouse$ cp calculator/* calculator-cpp/
  3. aries@uu3g:/wp/android-lighthouse$ ./build.sh
  4. /opt/android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ -c -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DQT_NO_QWS_TRANSFORMED -I/wp/android-lighthouse/src/3rdparty/android/precompiled/android-8/arch-arm/include -Os -g -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Wall -W -D_REENTRANT -DQT_NO_CORESERVICES -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I../mkspecs/android-g++ -I. -I../include/QtCore -I../include/QtNetwork -I../include/QtGui -I../include -I.moc/release-shared -I/opt/android-ndk-r5/platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r5/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r5/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -o .obj/release-shared/button.o button.cpp
  5. .......
  6. -obfuscate:
  7. -dex:
  8.      [echo] Converting compiled files and external libraries into /wp/android-lighthouse/calculator-java/bin/classes.dex...
  9. -package-resources:
  10.      [echo] Packaging resources
  11.      [aapt] Creating full resource package...
  12. -package-debug-sign:
  13. [apkbuilder] Creating calculator-debug-unaligned.apk and signing it with a debug key...
  14. debug:
  15.      [echo] Running zip align on final apk...
  16.      [echo] Debug Package: /wp/android-lighthouse/calculator-java/bin/calculator-debug.apk
  17. BUILD SUCCESSFUL
  18. Total time: 8 seconds
  19. 652 KB/s (304878 bytes in 0.456s)
  20.     pkg: /data/local/tmp/calculator-debug.apk
  21. Success
复制代码

 

  • 到这里,我们就成功编译并安装好了Qt版的calculator了,把logcat打开,我们试一试运行这个calculator,并看一看android log的输出,另起一个终端,里面输入
  1. adb logcat
复制代码

 

  • 由于run.sh有bug,所以我们就不用这个脚本来启动calculator,打开android模拟器或者手机的软件列表,找到名为calculator的应用程序,点击就可以运行了,如下图(左面终端里面是logcat输出的log信息):

Qt calculator run on android


用鼠标点击下这个计算器试试效果如何。
以后我们便可以按照以上步凑创建自己的Qt应用程序了。

作者: Aries @ 米狗族
网站: http://www.meegozu.com/thread-1199-1-1.html
欢迎转载,转载请保留以上信息。

加载中
0
树相马
树相马

希望QT再更新的时候,能出一个成熟的安卓开发包!

0
米狗族
米狗族

引用来自#2楼“树相马”的帖子

希望QT再更新的时候,能出一个成熟的安卓开发包!

nokia不可能推出android版的QT的。

0
a
alisa002

按照你的方法试验了,当运行 calculator 时 出现 异常退出,查看日志为

java.lang.unsatifiedLinkError:Library /data/local/plugins/sensors/libqtsensors_android.so not found

这是什么原因呢 ?

0
米狗族
米狗族

本来就没有这个文件:libqtsensors_android.so

你看看那个配置library的.xml文件,去掉这个so.

0
a
alisa002

不知道是哪个.xml 有路径吗?

0
L
LZ

Nokia的确不可能直接支持Android,但是它开发的lighthouse项目就是让QT可以移植到其他平台,包括Android,iOS,WebOS等等。只是Android的移植最简单,iOS也已经开始,大家可以到优酷上看到iThouch4运行QT的视频。BTW,lighthouse将正式进入Qt4.8。到那时,只需要开发一个插件,QT就可以轻松跑到各个平台上去运行了。

0
aoyanfeng
aoyanfeng

真要将200M的lib装进去?- -。。。200M,蛋痛。

0
金奇
金奇
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
lino310
lino310
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
HawkYang
HawkYang

好文,我顶!

像Kindle的SDK也是Java还在内测,就有爱好者crack一个QT上去了

不知道跟android的java程序相比,楼主有测试过QT性能如何吗?比如一个简单的位图搬移若干次以后计算时间

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部