Qt for Androidをソースからビルドして環境を作る

チャレンジしてみました。
QMLのTextEditで日本語が入力できないからあえて古いバージョンを入れれないかなーと思ったからなんですけどね。

※注意
この記事の内容では開発環境から実行した場合のみ自前でビルドしたライブラリを使用出来ます。
ランチャからアプリを実行した場合は通常通りMinistro2経由になります。

さて。

Qt for Androidプロジェクト「Necessitas」を使用します。

/// 環境 ///
 Ubuntu 10.10 (on Virtual Box)


/// Qt frameworkをビルド ///
 説明はこちら
 「Compile Qt framework
 1.Android NDKをインストール
 2.Android SDKをインストール
  説明はこちら
  「Setup Android SDK
  API 4/7/8/14の「SDK Platform」をインストールします。
  Eclipseのプラグインの設定は不要です。
  Eclipse自体不要です。
 3.gitからリポジトリをクローン
 4.スクリプト実行でビルド

 4.の手順でパラメータを変更するとARMの種類別にビルドができます。
 バイナリ配布の開発環境では3種類それぞれビルドした状態で配られています。


/// Qt Creatorをビルド ///
 説明はこちら
 「Compile QtCreator
 1.Qtの開発環境をインストール
  Qt Creator付のフルバージョンでOKです。
 2.gitからリポジトリをクローン
 3.ビルド
  qmakeしてmakeします。
  make -j3の3をちゃんと自分のマシンのコアに合わせないと失敗するらしいよ?

 説明には4.xで説明してるけど、4.8.0でもOKです。
 ビルドした結果、Qt Creatorは日本語表示対応でした。


/// Qt Creatorにframeworkの設定を追加 ///
 説明はこちら
 「Setup QtCreator
 1.「ant 1.8.0」と「openSDK6」をインストール
 2.qmakeのパスの設定
 3.Android SDK/NDKの設定


/// QtIndustrius-<API Level>.jarを作成 ///
 これを端末の「/data/local/qt/jar/」に配置しないと実行時に落ちます。
 コピーはデプロイ時に自動で行われます。
 元になるソースは「./android-qt/src/android/」にあります。
 その中の「./android-qt/src/android/jar/」が本体で、同じ位置にある「jar_X」がバージョン毎の差分になってます。

 起動できないときのエラー
  ClassNotFoundExceptionが発生します。
Starting remote process ...
D/dalvikvm( 368): GC_EXTERNAL_ALLOC freed 798 objects / 58288 bytes in 130ms W/System.err( 368): java.lang.ClassNotFoundException: org.kde.necessitas.industrius.QtActivityDelegate in loader dalvik.system.DexClassLoader@44ee1458

 1.スクリプト作成
  「buildQtJar.sh」で作るのですが、添付されてるそのままだと使えなかったので記事最後サンプルの内容のスクリプトファイルを適当なところに保存する。
  Android SDKのパスが記載されているので環境ごとに修正する。
 2.作業フォルダへ移動
  「./android-qt/jar/」へ移動する。
 3.スクリプト実行
buildQtJar.sh ../src/android/jar
  を実行する。
  実行すると一旦「jar」の内容をカレントにコピーして「jar_X」を上書きしてバージョン毎の対応を取る。
 4.出来上がり
  「./android-qt/jar/」の中に、「QtIndustrius-X.jar」が「4/7/8/14」で出来上がればOK。


/// Hello Worldで試す ///
 適当なアプリケーションを作成します。

 説明はこちら
 「Compile Qt framework」の中段くらい

 アプリのプロジェクトの設定の「実行時の設定」→「Deploy configuration」で設定します。
 「Deply local qt libs」にチェック
  デプロイ時に「/data/local/qt/~」にいろいろコピーされます。
  上で作ったQtIndustrius-.jarも自動でコピーされます。
 「Use local qt libs」にチェック
  開発環境から実行した時だけ上でコピーしたライブラリを使用して実行するようになります。
  ランチャから手動で実行した場合は同じapkでも通常通りMinistro2経由になります。


アプリは過去の記事を参考に作成してください。
Qt for Android試してみた
Qt for Androidでアプリを配布する(apkを作る)


/// buildQtJar.shのサンプル ///
#!/bin/bash -x

ANDROID_SDK_TOOLS_PATH=/home/iori/android-sdk-linux/tools/
ANT_TOOL_PATH=/usr/bin/
ANDROID_SDK_PLATFORM_TOOLS_PATH=/home/iori/android-sdk-linux/platform-tools/

TEMP_FOLDER=works

function createJar
{
# param $1 JARs src path
# param $2 JARs dest path
# param $3 API level
cp -a ../$1/* .
cp -a ../$1/../jar_$2/* .
${ANDROID_SDK_TOOLS_PATH}android update lib-project -t android-$2 -p .
${ANT_TOOL_PATH}ant clean release
${ANDROID_SDK_PLATFORM_TOOLS_PATH}dx --dex --output=../QtIndustrius-$2.jar bin/classes
}

mkdir -p $TEMP_FOLDER
cd $TEMP_FOLDER

for apiLevel in 4 7 8 14
do
    createJar $1 $apiLevel
done

cd ..
rm -r $TEMP_FOLDER