インテル® C++ コンパイラーと GNU* gcc を使用して x86 および ARM* APK を生成する

インテル® DPC++/C++ コンパイラーインテル® INDE

この記事は、インテル® 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) の参考訳です。


目次

  1. 概要
  2. ビルド環境を準備する
  3. コマンドラインからビルドする
    1. アプリケーションの設定
    2. アプリケーション・ワークスペースのクリーンアップ
    3. ARM* アーキテクチャー向けにバイナリーをビルドする
    4. インテル® C++ コンパイラーを使用して x86 アーキテクチャー向けにバイナリーをビルドする
    5. アプリケーション・パッケージ (APK) を用意する
  4. Eclipse* IDE からビルドする
  5. .\libs\[targetabi] 配下のバイナリーのクリーンアップを行わないことに注意する

概要

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 サンプルを使って説明します。

ビルド環境を準備する

次のツールが必要であり、インストールされていなければいけません。

“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 に移動し、次の手順に従います。

注: 前の節で説明したすべてのツールが、このウィンドウから利用できることを確認してください。

  1. アプリケーションの設定

    以降の手順で使用する build.xml ファイル生成するため、”hello2-gl2” のディレクトリーで以下のコマンドラインを実行します。

    $ android update project –target android-18 –name HelloGL2 –path .—subprojects
    –target android-18 : Jelly Beans MR2 Android リリースに相当します

  2. アプリケーション・ワークスペースのクリーンアップ

    すべての ISA アーキテクチャー向けのライブラリーを含むワークスペースを完全にクリーンアップするため、次のコマンドラインを実行します。

    $ ant clean
    $ ndk-build V=1 APP_ABI=all clean

    • V=1 : 実行されるすべてのコマンドを表示します。
    • APP_ABI=all : すべてのターゲット用の中間ファイルのクリーンアップを強制する。この引数が省略された場合、armeabi ターゲットも消去されます。
  3. 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 に生成されます。

  4. インテル® 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 に生成されます。

  5. アプリケーション・パッケージ(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 からビルドする

  1. 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 (完了)] をクリックします。

  2. プロジェクトにネイティブ・サポートを追加します。
    プロジェクト名を右クリックして、[Android Tools] > [Add Native Support…] を選択します。

  3. それぞれのターゲット別に異なるビルド設定を作成し、ビルドコマンドに設定します。
    プロジェクトを右クリックし、[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] をクリックします。

  4. アプリケーションのワークスペースをクリーンアップします。
    プロジェクトを右クリックして、[Build configurations] > [Clean all…] を選択します。

    注: jni ディレクトリー下に Application.mk が存在する場合、以下の行が含まれていないことを確認してください。

    NDK_APP.local.cleaned_binaries=true

  5. 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 にファイルが出力されていることを確認します。

  6. インテル® コンパイラーを使用して x86 ターゲットのアプリケーション・バイナリーをビルドします。
    • プロジェクトを右クリックし、[Build configurations] > [Set Active] > [x86_icc] を選択します。
    • プロジェクトを右クリックし、[Build Project] を選択します。
    • [eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so  にファイルが出力されていることを確認します。

  7. 設定されたすべてのターゲットのアプリケーション・バイナリーをビルドします。
    • 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

  8. 署名なしのアプリケーション・パッケージを作成します。
    プロジェクトを右クリックして、[Android Tools] > [Export Unsigned Application Package…] を選択します。

.\libs\[targetabi] 配下のバイナリーのクリーンアップを行わないことに注意する

NDK_APP.local.cleaned_binaries=true 引数を設定して、以前にビルドされたライブラリーの削除を抑制すると、将来の NDK リリースで動作を停止する可能性があります。クリーン・インストールされたバイナリーのターゲットで削除動作を無効にする方法については、[ndk-dir]/build/core/setup-app.mk makefile を参照してください。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

 

タイトルとURLをコピーしました