【网学网提醒】:网学会员为您提供Android平台Qt开发入门教程参考,解决您在Android平台Qt开发入门教程学习中工作中的难题,参考学习。
Android平台Qt开发入门教程
很多人会问,Android平台可以不使用Java开发应用
程序??
我做Android平台native开发之前,也有这么想过,但是我又想,底层系统全是c/c++代码,用c/c++开发Android平台
程序是可能的,只是需要使用系统非公开的API(就是android源代码,而非NDK里面提供的头文件),比如libui和skia。
好了,由于我的工作是把C++中间件移植到Android平台,所以会对Qtforandroid这个项目比较了解,毕竟国内做这些的还比较少,所以需要参考android-lighthouse如何解决的文字显示,图形,键盘,触摸屏事件等等。
言归正传,我们开始今天的教程:在Android平台开发Qt应用
程序。
前提:
?你的系统必须是linux,或者MACOSX。在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访问):youtube/watch?v=VU_zPnQrM6E
下载,编译android-lighthouse:
?打开终端,输入"gitclone
git://gitorious.org/~taipan/qt/android-lighthouse.git",便开始下载android-lighthouse的源码。
下载好后,android-lighthouse目录结构如下图:
?
下载android-qtcreator,在终端中输入"gitclone
git://gitorious.org/~taipan/qt-creator/android-qt-creator.git",开始下载;如果你不想使用图形界面开发Qt应用
程序,你可以不用下载,下面是我通过打包
下载的qtcreator2.1forandroid的文件目录结构,压缩包总共21M.
aries@uu3g:/wp/qt-creator-android-qt-creator$ls
distHACKINGLICENSE.LGPLqtcreator.proscriptssrcdocLGPL_EXCEPTION.TXTqtcreator.priREADMEsharetests
?然后我们修改以下环境变量,开始编译android-lighthouse:
1.androidconfigbuild.sh文件,把ANDROID_NDK_ROOT,
ANDROID_NDK_HOST,ANDROID_NDK_TOOLCHAIN_PREFIX等等这5个变量安装你
下载的android-ndk进行修改,比如下面是我自己电脑上面设置的变量:exportANDROID_NDK_ROOT=/opt/android-ndk-r5exportANDROID_NDK_HOST=linux-x86
exportANDROID_NDK_TOOLCHAIN_PREFIX=arm-linux-androideabiexportANDROID_NDK_TOOLCHAIN_VERSION=4.4.3exportANDROID_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自行编译。编译结束后,输入sudomkdir/data/local/qtsudomakeinstall
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。首先用androidlist列出你的AVD列表,如下图
然后使用emulator-avd
-partition-size
指定分区大小并启动模拟器,如下所示,我启动的是android2.2,分区大小为256M的AVD:
aries@uu3g:~$emulator-avdandroid2.2-partition-size256
在模拟器里面查看分区大小:
?这里我们使用模拟器来做例子,使用adb-epush把所有Qt库push到模拟器
中,你也可以使用android-lighthouse自带的脚本来完成这个任务,push_qt_libs.sh脚本内容如下(注意修改你的push_qt_libs.sh里面的strip工具路径):
#!/bin/sh
adbshellrm-r/data/local/qt||exit0rm-fralmkdiral
cp-alib/*.so*al/
/opt/android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip--strip-unneededal/*
adbpushal/data/local/qt/lib
adbpushimports/data/local/qt/importsadbpushplugins/data/local/qt/plugins
运行Qt应用程序:
?以上步凑结束后,我们还需要修改一些shell脚本才可以正常的工作,
android-lighthousemaintrunk里面的shell脚本有一些bug,这里我们就动手开始改他,在android-lighthouse根目录下面找到
create_android_lighthouse_project.sh,打开,根据你android-ndk的版本路径,修改以下内容:
......
#修改以下2行,指向你的android-sdk和android-lighthouse源码路径SDK_ROOT=/home/buus/dev/android-sdk-linux_x86LIGHTHOUSE_ROOT=/home/buus/dev/android-lighthouse......
#我的android-sdk里面,adb在platform-tools目录下面,所以修改为$SDK_ROOT/platform-tools/adb
\$SDK_ROOT/tools/adbinstall-rbin/\$PROJECT_NAME-debug.apk
......#同上
\$SDK_ROOT/tools/adbshellamstart-norg.\$PROJECT_NAME.qt/.QtMain......#同上
\$SDK_ROOT/tools/adbinstall-rbin/\$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.xmlcp\$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/srccp-r$LIGHTHOUSE_ROOT/src/android/java/res/*$PROJECT_NAME-java/ressed-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.xmlsed-i"s/Applicationname/$PROJECT_NAME/g"$J_PRO/res/values/strings.xmlcp\$Q_PRO/\$PROJECT_NAME\$J_PRO/libs/armeabi/lib\$PROJECT_NAME.so#我们编译cpp代码时是生成可执行文件,不是生成动态库,但这里必须以动态库的形式加载
注意其中的几个"sed",你所需要替代的源对象可能和这里的不一样,请根据你的情况做适当修改。
修改这些主要是由于example里面的代码没有及时更新,并且我们还需要res里面的libs.xml文件,然后保存,这里有一份我修改好的,针对2011年1月份的trunk做的修改。
[attach]694[/attach]
?以上步凑结束后,我们开始拷贝一个例子程序来开始我们的Qtforandroid之旅。
拷贝examples/widgets/calculator整个目录到android-lighthouse根目录下面,然后使用"create_android_lighthouse_project.sh"创建此c++代码对应的java代码,我们在终端里面运行
./create_android_lighthouse_project.sh-ncalculator
?命令结束后,会在当前目录产生calculator-cpp和calculator-java2个目录,
以及build.sh,creatorbuild.sh,run.sh等工具脚本。这里需要注意,calculator-cpp目录下面的源代码是stub程序,就是什么事情都不做作的代码,我们需要把这个目录下面的所有文件都删除掉,然后把calculator目录下面的
所有文件拷贝到calculator-cpp目录下,然后再运行(在这里你的模拟器必须启动,或者手机已经正确连接上电脑了):
./build.sh
我执行以上几个步凑后的终端:
aries@uu3g:/wp/android-lighthouse$rmcalculator-cpp/*-rfaries@uu3g:/wp/android-lighthouse$cpcalculator/*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.obutton.cpp.......-obfuscate:-dex:
[echo]Convertingcompiledfilesandexternallibrariesinto/wp/android-lighthouse/calculator-java/bin/classes.dex...
-package-resources:
[echo]Packagingresources
[aapt]Creatingfullresourcepackage...
-package-debug-sign:
[apkbuilder]Creatingcalculator-debug-unaligned.apkandsigningitwithadebugkey...debug:
[echo]Runningzipalignonfinalapk...[echo]DebugPackage:
/wp/android-lighthouse/calculator-java/bin/calculator-debug.apk
BUILDSUCCESSFULTotaltime:8seconds
652KB/s(304878bytesin0.456s)
pkg:/data/local/tmp/calculator-debug.apkSuccess
?到这里,我们就成功编译并安装好了Qt版的calculator了,把
logcat
打开,我
们试一试运行这个calculator,并看一看androidlog的输出,另起一个终端,里面输入
adblogcat
?由于run.sh有bug,所以我们就不用这个脚本来启动calculator,打开android
模拟器或者手机的软件列表,找到名为calculator的应用程序,点击就可以运行了,如下图(左面终端里面是logcat输出的log信息):
用鼠标点击下这个计算器试试效果如何。
以后我们便可以按照以上步凑创建自己的Qt应用程序了。
作者:Aries@米狗族