求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
Android平台Qt开发入门教程
 

发布于2013-5-17

 

很多人会问,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-qtcreator, 在终端中输入"git clone git://gitorious.org/~taipan/qt-creator/android-qt-creator.git",开始下载;如果你不想使用图形界面开发Qt应用程序,你可以不用下载,下面是我通过打包下载的qtcreator 2.1 for android的文件目录结构,压缩包总共21M.

aries@uu3g:/wp/qt-creator-android-qt-creator$ ls
dist HACKING LICENSE.LGPL qtcreator.pro scripts src
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进行修改,比如下面是我自己电脑上面设置的变量:

export ANDROID_NDK_ROOT=/opt/android-ndk-r5
export ANDROID_NDK_HOST=linux-x86
export ANDROID_NDK_TOOLCHAIN_PREFIX=arm-linux-androideabi
export ANDROID_NDK_TOOLCHAIN_VERSION=4.4.3
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文件如下图所示:

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

./androidconfigbuild.sh

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

sudo mkdir /data/local/qt
sudo make install

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

安装qt动态库:

手机:首先确保你的手机有足够大的空间安装这些动态库(全部安装需要200M的空间),其中QtXml有50M, QtGui有90M,QtCore有20多M。这些都是带调试信息的动态库。(2011年1月20日注:其实不需要这么大的空间,strip过后的library只需要10多M就可以了,我原来拷贝的所有library是没有strip过的)

模拟器:模拟器默认启动会把分区大小设置为64M,这里是不够用的,我们需要手动设置分区大小,我这里设置为256M。首先用android list列出你的AVD列表,如下图

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

aries@uu3g:~$ emulator -avd android2.2 -partition-size 256

在模拟器里面查看分区大小:

这里我们使用模拟器来做例子,使用adb -e push把所有Qt库push到模拟器中,你也可以使用android-lighthouse自带的脚本来完成这个任务,push_qt_libs.sh脚本内容如下(注意修改你的push_qt_libs.sh里面的strip工具路径):

#!/bin/sh

adb shell rm -r /data/local/qt || exit 0
rm -fr al
mkdir al
cp -a lib/*.so* al/

/opt/android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip --strip-unneeded al/*

adb push al /data/local/qt/lib
adb push imports /data/local/qt/imports
adb push plugins /data/local/qt/plugins

运行Qt应用程序:

以上步凑结束后,我们还需要修改一些shell脚本才可以正常的工作,android-lighthouse main trunk里面的shell脚本有一些bug,这里我们就动手开始改他, 在android-lighthouse根目录下面找到create_android_lighthouse_project.sh,打开,根据你android-ndk的版本路径, 修改以下内容:

......
#修改以下2行,指向你的android-sdk和android-lighthouse源码路径
SDK_ROOT=/home/buus/dev/android-sdk-linux_x86
LIGHTHOUSE_ROOT=/home/buus/dev/android-lighthouse
......
#我的android-sdk里面,adb在platform-tools目录下面,所以修改为$SDK_ROOT/platform-tools/adb
\$SDK_ROOT/tools/adb install -r bin/\$PROJECT_NAME-debug.apk
......
#同上
\$SDK_ROOT/tools/adb shell am start -n org.\$PROJECT_NAME.qt/.QtMain
......
#同上
\$SDK_ROOT/tools/adb install -r bin/\$PROJECT_NAME-debug.apk

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

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

替换为

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

注意其中的几个"sed", 你所需要替代的源对象可能和这里的不一样,请根据你的情况做适当修改。

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

create_android_lighthouse_project.sh (5.49 KB, 下载次数: 228)

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

./create_android_lighthouse_project.sh -n calculator

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

./build.sh

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

aries@uu3g:/wp/android-lighthouse$ rm calculator-cpp/* -rf
aries@uu3g:/wp/android-lighthouse$ cp calculator/* calculator-cpp/
aries@uu3g:/wp/android-lighthouse$ ./build.sh
/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
.......
-obfuscate:

-dex:
[echo] Converting compiled files and external libraries into /wp/android-lighthouse/calculator-java/bin/classes.dex...

-package-resources:
[echo] Packaging resources
[aapt] Creating full resource package...

-package-debug-sign:
[apkbuilder] Creating calculator-debug-unaligned.apk and signing it with a debug key...

debug:
[echo] Running zip align on final apk...
[echo] Debug Package: /wp/android-lighthouse/calculator-java/bin/calculator-debug.apk

BUILD SUCCESSFUL
Total time: 8 seconds
652 KB/s (304878 bytes in 0.456s)
pkg: /data/local/tmp/calculator-debug.apk
Success

 

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

adb logcat

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

用鼠标点击下这个计算器试试效果如何。

以后我们便可以按照以上步凑创建自己的Qt应用程序了。

相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
 
分享到
 
 


android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...