很多人會問,Android平台可以不使用Java開發應用程序??
我做Android平台native開發之前,也有這麼想過,但是我又想,底層系統全是c/c++代碼,用c/c++開發Android平台程序是可能的,只是需要使用系統非公開的API(就是android源代碼,而非NDK裡面提供的頭文件),比如libui和skia。
好了,由於我的工作是把C++中間件移植到Android平台,所以會對Qt for android這個項目比較了解,畢竟國內做這些的還比較少,所以需要參考android-lighthouse如何解決的文字顯示,圖形,鍵盤,觸摸屏事件等等。
言歸正傳,我們開始今天的教程: 在Android平台開發Qt應用程序。
前提:
下載,編譯android-lighthouse:
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
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文件如下圖所示:
./androidconfigbuild.sh
然後就等待結果,如果你設置的是手動輸入make,你需要在config完成之後輸入make自行編譯。
編譯結束後,輸入
sudo mkdir /data/local/qt
sudo make install
android-lighthouse默認會安裝到/data/local/qt目錄下。
安裝qt動態庫:
然後使用emulator -avd <avd_name> -partition-size <size_in_megabyte>指定分區大小並啟動模擬器,如下所示,我啟動的是android2.2, 分區大小為256M的AVD:
aries@uu3g:~$ emulator -avd android2.2 -partition-size 256
在模擬器裡面查看分區大小:
#!/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應用程序:
......
#修改以下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做的修改。
[attach]694[/attach]
./create_android_lighthouse_project.sh -n calculator
./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
adb logcat
用鼠標點擊下這個計算器試試效果如何。
以後我們便可以按照以上步湊創建自己的Qt應用程序了。