この記事は、インテル® Developer Zone に公開されている「Creating an x86 and ARM* APK using the Intel® Compiler and GNU* gcc」(http://software.intel.com/en-us/articles/creating-an-x86-and-arm-apk-using-the-intelr-compiler-and-gnu-gcc) の参考訳です。
目次
概要
ARM* もしくは x86 命令セット・アーキテクチャー (ISA) 上で動作する Android* デバイスがあります。ISA が異なるとバイナリー互換がなく、アプリケーションがネイティブコードを含む場合、各ターゲット ISA ごとにネイティブバイナリーを用意する必要があります。”fat (ファット)” Android* アプリケーション・パッケージ (“fat” APK) は、そのようなアプリケーションを配布する仕組みの 1 つです。
この記事では、異なる ISA をターゲットとするライブラリーと同様に Dalvik* 仮想マシン (Dalvik 2013) 向けの ISA に依存しない dex ファイルを含む ”fat” APK をビルドする方法を手順を追って説明します。これには、インテル® C++ コンパイラー Android* 向けを使って x86 ネイティブ・アプリケーション・バイナリーをビルドする方法も含まれます。
手順を説明するため、NDK r9 ディストリビューションに含まれる hello-gl2 サンプルを使って説明します。
ビルド環境を準備する
次のツールが必要であり、インストールされていなければいけません。
- [android-sdk-dir] にインストールされている Android* SDK バンドル (2013)
- [ndk-dir] にインストールされている Android* ネイティブ開発キット (Android NDK 2013)
- [jdk6-dir] にインストールされる Java* 開発キット 6 (http://www.oracle.com/technetwork/java/javase/downloads/index.html)
- [ant-dir] にインストールされる Apache* Ant* ツールのバージョン 1.8
- [icc-dir] にインストールされる インテル® C++ コンパイラー Android* 向け製品。これは最後にインストールします。
“PATH” 環境変数に以下のディレクトリーを追加します。
- “ndk-build” ツールを使用するためのディレクトリー “[ndk-dir]”
- “android” ツールを使用するためのディレクトリー “[android-sdk-dir]\sdk\tools”
- “ant” ツールを使用するためのディレクトリー “[ant-dir]\bin”
- “java” VM を使用するためのディレクトリー “[jdk6-dir]\jre\bin”。これは、”ant” ツールを必要とします。Windows* 環境では、”program files (x86)” 向けに ”PROGRA~2” のようなショートフォルダー名が利用されます。
- 新しい環境変数 “JAVA_HOME=[jdk6-dir]” を作成します。
コマンドラインからビルドする
この節では、コマンドラインから ARM* と x86 アーキテクチャーの Android* デバイスをサポートする APK パッケージを作成する方法を説明します。
最初に、コマンドウィンドウ (Windows*) もしくはターミナルウィンドウ (Linux*) を開きます。Android* NDK サンプル “hello-gl2” が格納されているディレクトリー [ndk-dir]\samples\hello-gl2 に移動し、次の手順に従います。
注: 前の節で説明したすべてのツールが、このウィンドウから利用できることを確認してください。
-
アプリケーションの設定
以降の手順で使用する build.xml ファイル生成するため、”hello2-gl2” のディレクトリーで以下のコマンドラインを実行します。
$ android update project –target android-18 –name HelloGL2 –path .—subprojects
–target android-18 : Jelly Beans MR2 Android リリースに相当します -
アプリケーション・ワークスペースのクリーンアップ
すべての ISA アーキテクチャー向けのライブラリーを含むワークスペースを完全にクリーンアップするため、次のコマンドラインを実行します。
$ ant clean
$ ndk-build V=1 APP_ABI=all clean- V=1 : 実行されるすべてのコマンドを表示します。
- APP_ABI=all : すべてのターゲット用の中間ファイルのクリーンアップを強制する。この引数が省略された場合、armeabi ターゲットも消去されます。
-
ARM* アーキテクチャー向けにバイナリーをビルドする
ARM* アーキテクチャー向けのバイナリーをビルドするため以下のコマンドラインを実行します。
$ ndk-build APP_ABI=armeabi V=1 NDK_TOOLCHAIN=arm-linux-androideabi-4.8
- APP_ABI=armeabi : ARM* ターゲット向けのコンパイルを設定します。
- NDK_TOOLCHAIN=arm-linux-androideabi-4.8 : デフォルトの GNU* gcc 4.6 を上書きして gcc 4.8 を使用します。
アプリケーション・バイナリー (libgl2jni.so) は、.\libs\armeabi\libgl2jni.so に生成されます。
-
インテル® C++ コンパイラーを使用して x86 アーキテクチャー向けにバイナリーをビルドする
x86 アーキテクチャー向けにインテル® C++ コンパイラーを使用してアプリケーションのバイナリーをビルドするには、次のコマンドラインを実行します。
$ ndk-build APP_ABI=x86 V=1 NDK_TOOLCHAIN=x86-icc NDK_APP.local.cleaned_binaries=true
- APP_ABI=x86 : x86 アーキテクチャー向けのコンパイル設定
- NDK_TOOLCHAIN=x86-icc : デフォルト・コンパイラーである gcc 4.6 を上書きしてインテル® C++ コンパイラー Android* 向けを使用
- NDK_APP.local.cleaned_binaries=true : libs/armeabi ディレクトリーにあるライブラリー・ファイルの消去を抑制する。末尾の注意を参照してください。
アプリケーション・バイナリー (libgl2jni.so) は、.\libs\x86\libgl2jni.so に生成されます。
-
アプリケーション・パッケージ(APK) を用意する
各 Android* ターゲット向けにすべてのバイナリーがビルドできたら、libs\[targetabi] に各アーキテクチャー向けに必要なライブラリーが含まれているか確認します。
パッケージの作成を簡素化し、パッケージの署名を回避するには、次のコマンドラインでデバッグパッケージを作成します。
$ ant debug
コマンドの実行後、.\bin ディレクトリー下に HelloGL2-debug.zip パッケージが新たに生成されます。このパッケージは、x86 もしくは Android* SDK で提供されるレベル 18 以上の API をサポートする ARM* エミュレーターで実行できます。
HelloGL2-debug.zip パッケージは、ARM* EABI と x86 の 2 つのターゲットのライブラリーを含んでいます。
Eclipse* IDE からビルドする
- Eclipse* を開き、[ndk-dir]/samples/hello-gl2 サンプルをロードします。
- メニューから [File] > [New] > [Project] > [Android Project…] を選択します。
- [Android project from existing code] ボタンを選択します。
- Android* 1.5 以上の任意の API レベルを選択します。
- [Root Directory] フィールドで、[Browse…] をクリックして [ndk-dir]/samples/hello-gl2 ディレクトリーを選択します。
- [Finish (完了)] をクリックします。
- プロジェクトにネイティブ・サポートを追加します。
プロジェクト名を右クリックして、[Android Tools] > [Add Native Support…] を選択します。 - それぞれのターゲット別に異なるビルド設定を作成し、ビルドコマンドに設定します。
プロジェクトを右クリックし、[Project properties] > [C/C++ Builder] > [Manage configurations…] を選択します。
デフォルト設定に基づいて、次の新しい設定を追加するには [New] をクリックします。- インテル® コンパイラー icc を使用した x86 ターゲットには、”x86_icc”
- GNU gcc を使用した ARM ターゲットをには、”amr_gcc”
同じプロジェクトのプロパティー・ウインドウで、設定を “x86_icc” にします:
- [Use default build command] のチェックを外します。
- 以下の行を [Build command] フィールドに追加します。
ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc
再び同じプロジェクトのプロパティー・ウインドウで、設定を “arm_gcc” にします。
- [Use default build command] のチェックを外します。
- 以下の行を [Build command] フィールドに追加します。
ndk-build APP_ABI=armeabi NDK_TOOLCHAIN=arm-linux-androideabi-4.8 - [OK] をクリックします。
- アプリケーションのワークスペースをクリーンアップします。
プロジェクトを右クリックして、[Build configurations] > [Clean all…] を選択します。注: jni ディレクトリー下に Application.mk が存在する場合、以下の行が含まれていないことを確認してください。
NDK_APP.local.cleaned_binaries=true
- gcc を使用して ARM* ターゲットのアプリケーション・バイナリーをビルドします。
- jni ディレクトリー下に、次の行を含む Application.mk を生成します。
NDK_APP.local.cleaned_binaries=true - プロジェクトを右クリックし、[Build configurations] > [Set Active] > [arm_gcc] を選択します。
- プロジェクトを右クリックし、[Build Project] を選択します。
- [eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so にファイルが出力されていることを確認します。
- jni ディレクトリー下に、次の行を含む Application.mk を生成します。
- インテル® コンパイラーを使用して x86 ターゲットのアプリケーション・バイナリーをビルドします。
- プロジェクトを右クリックし、[Build configurations] > [Set Active] > [x86_icc] を選択します。
- プロジェクトを右クリックし、[Build Project] を選択します。
- [eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so にファイルが出力されていることを確認します。
- 設定されたすべてのターゲットのアプリケーション・バイナリーをビルドします。
- jni ディレクトリー下に、次の行を含む Application.mk を生成します。
NDK_APP.local.cleaned_binaries=true - プロジェクトを右クリックして、[Build configurations] > [Build All…] を選択します。
- 以下の出力ファイルを確認します。
- [eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so
- [eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so
- jni ディレクトリー下に、次の行を含む Application.mk を生成します。
- 署名なしのアプリケーション・パッケージを作成します。
プロジェクトを右クリックして、[Android Tools] > [Export Unsigned Application Package…] を選択します。
.\libs\[targetabi] 配下のバイナリーのクリーンアップを行わないことに注意する
NDK_APP.local.cleaned_binaries=true 引数を設定して、以前にビルドされたライブラリーの削除を抑制すると、将来の NDK リリースで動作を停止する可能性があります。クリーン・インストールされたバイナリーのターゲットで削除動作を無効にする方法については、[ndk-dir]/build/core/setup-app.mk makefile を参照してください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。