Android平台Qt开发⼊门教程
很多⼈会问,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-lighthouse, 这个就是android平台的Qt版本,国外个⼈移植的,nokia官⽅是不会发布这样的版本的。git软件库地址:git:///~taipan/qt/android-lighthouse.git
当然你还可以下载整合了android平台的qtcreator, 软件库地址:git:///~taipan/qt-creator/android-qt-creator.git  这样你可以直接在qtcreator⾥⾯开发测试android应⽤程序,这⾥有个视频介绍qtcreator开发android应⽤程序(被墙了,可以⽤VPN或proxy访问):
下载,编译android-lighthouse:
打开终端,输⼊"git clone git:///~taipan/qt/android-lighthouse.git",便开始下载android-lighthouse的源码。下载好
后,android-lighthouse⽬录结构如下图:
下载android-qtcreator, 在终端中输⼊"git clone git:///~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++/f⽂件,把NDK_ROOT, NDK_HOST,NDK_TOOLCHAIN_PREFIX, ANDROID_PLATFORM, NDK_TOOLCHAIN_VERSION按
照你下载的android-ndk进⾏修改,⽐如我使⽤的是x86平台的android-ndk-r5(⾮64位系统),我修改后的mkspecs/android-g++/f⽂件如下图所⽰:
做好以上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/l $J_l
cp -r $LIGHTHOUSE_ROOT/src/android/java/src/com $PROJECT_NAME-java/src
sed -i "s/animatedtiles/$PROJECT_NAME/g" $J_l
cp \$Q_PRO/lib\$PROJECT_NAME.so* \$J_PRO/libs/armeabi    #我们编译cpp代码时是⽣成可执⾏⽂件,不是⽣成动态库
替换为
cp $LIGHTHOUSE_ROOT/src/android/l $J_l
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_l
sed -i "s/Application name/$PROJECT_NAME/g" $J_PRO/res/l
cp \$Q_PRO/\$PROJECT_NAME \$J_PRO/libs/armeabi/lib\$PROJECT_NAME.so #我们编译cpp代码时是⽣成可执⾏⽂件,不是⽣成动态库,但这⾥必须以动态库的形式加载
注意其中的⼏个"sed", 你所需要替代的源对象可能和这⾥的不⼀样,请根据你的情况做适当修改。
修改这些主要是由于example⾥⾯的代码没有及时更新,并且我们还需要res⾥⾯的l⽂件,然后保存,这⾥有⼀份我修改好的,针对2011年1⽉份的trunk做的修改。
[attach]694[/attach]
以上步凑结束后,我们开始拷贝⼀个例⼦程序来开始我们的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/
-package-resources:
[echo] Packaging resources
[aapt] Creating full
-package-debug-sign:
[apkbuilder] Creating calculator-debug-unaligned.apk and signing it with a
debug:
[echo] Running zip align on
[echo] Debug Package: /wp/android-lighthouse/calculator-java/bin/calculator-debug.apk
BUILD SUCCESSFULandroid学习教程
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应⽤程序了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。