サンプル

Android Game Development Extension のサンプルでは、主な拡張機能の使用方法を示します。このトピックでは、サンプルとその実行に必要な設定について説明します。

次のサンプルはダウンロード ページから入手できます。

  • HelloJNI: 入門プロジェクト。
  • Endless-Tunnel: Android 専用のプロジェクト。
  • Teapot: Windows および Android 向けのクロス プラットフォーム プロジェクト。
  • AssemblyCode-Link-Objects: アセンブリ ソースコードを含むテンプレート プロジェクト。

準備

  • Android Game Development Extension とサンプルをインストールします。詳しくは、クイックスタートをご覧ください。クイックスタートでは、サンプルをビルドして実行する方法を説明し、例として Teapot サンプルの Android バージョンを使用しています。

  • プロジェクトの構成ガイドでは、Android プラットフォームや APK の追加など、拡張機能を使用するプロジェクトの設定を構成する方法について説明します。

HelloJNI

HelloJNI サンプルは、アプリ ウィンドウに「Hello From JNI」というメッセージを表示する簡単なプロジェクトです。プロジェクトでは、Windows と Android に異なるソースコード セットを使用しています。

  • Android ソースコードおよび Gradle ビルド スクリプト ディレクトリ: HelloJNI\AndroidPackaging
  • Windows ソースコードおよび Visual Studio プロジェクト ディレクトリ: HelloJNI

プロジェクトをビルドすると、Visual Studio は次の設定をアプリレベルの build.gradle ファイルに渡します。これらの設定を変更するには、Gradle ビルド スクリプトを変更します。

  • MSBUILD_NDK_VERSION
  • MSBUILD_MIN_SDK_VERSION
  • MSBUILD_JNI_LIBS_SRC_DIR
  • MSBUILD_ANDROID_OUTPUT_APK_NAME
  • MSBUILD_ANDROID_GRADLE_BUILD_OUTPUT_DIR

サンプルを設定して実行する手順は次のとおりです。

  1. Visual Studio で、HelloJNI サンプルを開いてビルドします。
  2. Android arm64-v8a プラットフォームを追加します。詳しくは、Android プラットフォームの追加をご覧ください。
  3. 新しいプラットフォームに Android APK アイテムを追加します。
  4. プロジェクトをコンパイルします。
  5. 次の Android プラットフォームを追加してから、それぞれに Android APK アイテムを追加します。Android-armeabi-v7aAndroid-x86Android-x86_64
  6. サンプルをビルドして実行します。

Endless-Tunnel

Endless-Tunnel サンプルは、プレーヤーがトンネルの終点を目指しながら白いキューブを集める Android ゲームです。これは GitHub の Android NDK リポジトリの OpenGL サンプルから移植されました。同ゲームの Windows 版は、このサンプルでは提供されていません。

サンプルでは設定と Android プラットフォームがすでに構成されているので、変更を行わずに Visual Studio でプロジェクトをビルドして実行できます。ソリューションを開くと、Solution Explorer に次のモジュールが表示されます。

  • endless-tunnel: ゲームロジックを表示するアプリ モジュール。
  • glm: 静的ライブラリとしてビルドされた OpenGL Math リポジトリのスナップショット。
  • native_app_glue: NativeActivity オブジェクトと通信する NDK ラッパー。

Teapot

Teapot サンプルは、昔ながらのティーポットを OpenGL ES でレンダリングします。以下の機能を試せるよう、Android Game Development Extension で利用できるようになっています。

  • クロス プラットフォーム プロジェクト開発: Windows および Android 向けの Teapot サンプルをビルドできます。
  • カスタム Android パッケージの使用状況: Gradle ビルド スクリプトはサンプルのルート ディレクトリに移動しました。このディレクトリには Teapot.sln ファイルが配置されています。
  • 試験運用版の Ninja ビルド統合: Android Studio でプロジェクトを開けます。
  • カスタムの Android 設定: Address Sanitizer(ASan)と Hardware Address Sanitizer(HWAsan)の使用方法が示されます。

Teapot サンプルの実装は複数の部分に分割されています。これは、大きなクロス プラットフォーム アプリやゲームでは一般的です。

  • GameApplication モジュール: ユーザーによるティーポットの回転やアプリの統計情報の更新など、ユーザー アクションとアプリの状態を定義します。
  • GameEngine モジュール: コア レンダリング モジュールを実装します。

サンプルを設定して Android で実行するには、クイックスタートをご覧ください。サンプルを設定して Windows で実行する手順は次のとおりです。

  1. GLEW をインストールします。
    1. GLEW をダウンロードして解凍します。
    2. バイナリ ファイルを $your-glew-directory\bin\Release\x64 から %SystemRoot%\system32 にコピーします。
  2. freeglut をインストールします。
    1. freeglut をダウンロードして解凍します。
    2. $your-freeglut-directory\bin\x86\freeglut.dll%SystemRoot%\system32 にコピーします。
  3. freeglut プロジェクトの依存関係を追加します。
    1. Visual Studio で Teapot.sln を開きます。
    2. メニューで、[Debug] > [x64] > [Local Windows Debugger] をクリックします。
    3. [Solution Explorer] で、[GameApplication] を右クリックして [Properties] > [C/C++] > [General] > [Additional Include Directories] を選択します。
    4. $your-freeglut-dir\include をパスに追加します。
      [Additional Include Directories] ダイアログのスクリーンショット。
    5. [OK] をクリックします。
    6. [Linker] > [General] > [Additional Library Directories] を選択します。
    7. $your-freeglut-dir\lib\x64 をパスに追加します。 [Additional Library Directories] ダイアログのスクリーンショット
    8. [OK] をクリックします。
    9. [Linker] > [General] > [Additional Library Directories] を選択します。
    10. freeglut.lib をパスに追加します。
    11. [OK] をクリックします。
  4. GLEW プロジェクトの依存関係を追加します。
    1. [Solution Explorer] ペインで、[GameApplication] を右クリックして [Properties] > [C/C++] > [General] > [Additional Include Directories] を選択します。
    2. $your-glew-dir\include をパスに追加します。
    3. [OK] をクリックします。
    4. [Linker] > [General] > [Additional Library Directories] を選択します。
    5. $your-glew-dir\lib\Release\x86 をパスに追加します。
    6. [OK] をクリックします。
    7. [Linker] > [General] > [Additional Library Directories] を選択します。
    8. glew32.lib をパスに追加します。
    9. [OK] をクリックします。
  5. Windows でサンプルを実行します。
    1. Visual Studio のツールバーで、[Local Windows Debugger] 実行ボタンをクリックします。
    2. サンプルは次のようになります。
      Windows 上で実行されている Teapot サンプルのスクリーンショット。

これはアセンブリ ソースコードと C / C++ ソースコードから Android ネイティブ ライブラリを生成する方法を示すテンプレート プロジェクトです。主なコンポーネントは次のとおりです。

  • AssemblyCode-Link-Objects: C++ ソースコードおよびアセンブリ ソースコードからビルドされたメインの Android ネイティブ ライブラリ。
  • StaticLib: from_static_lib_assembly_code_as 関数をエクスポートするヘルパー静的ライブラリ。

プロジェクトでは複数のアーキテクチャがサポートされます。サポートされている各アーキテクチャには、StaticLib からエクスポートされた関数を実装する独自のソースファイルがあります。ビルドするプラットフォームのアセンブリ ソースファイルのみを含める必要があります。このプロジェクトには、カスタム ビルドツールを使用したビルドでのアセンブリ ファイルが含まれています。

サンプルを設定してビルドする手順は次のとおりです。

  1. Visual Studio で、アセンブリ ファイルにカスタム ビルドツールが構成されていることを確認します。
    1. [Solution Explorer] でアセンブリ ファイルを右クリックし、[Properties] をクリックします。これにより、ファイルの [Properties Pages] ダイアログが開きます。
    2. Android-arm64-v8a の [All configurations] などの構成とプラットフォームを選択します。
    3. [General] > [Exclude from Build] が [No] に設定されていることを確認します。
    4. [General] > [Item Type] が [Custom Build Tool] に設定されていることを確認します。
    5. 適用する変更がある場合は [Apply] をクリックします。
    6. [Configuration Properties] > [Custom Build Tools] > [Command Line]$(AsToolExe) -o "$(IntDir)%(FileName).o" %(FullPath) に設定されていることを確認します。NDK には、CPU アーキテクチャごとに個別のアセンブラが含まれており、$(AsToolExe) は適切なアセンブラにマッピングされています。このサンプルでは、NDK ツールチェーンを使用して x86 と x86_64 の両方の Android プロジェクトをビルドします。x86_64 Android プラットフォームに yasm を使用する場合は、代わりに $(YasmToolExe) を使用してください。
    7. [Configuration Properties] > [Custom Build Tools] > [Outputs]$(IntDir)%(FileName).o に設定されていることを確認します。この文字列は、コマンドライン設定に含める必要があります。
    8. [Configuration Properties] > [Custom Build Tools] > [Link Objects]Yes に設定されていることを確認します。

    たとえば、Android-arm64-v8a の設定は、次のスクリーンショットのようになります。

    カスタムビルド ツールのプロパティ ページのスクリーンショット。
  2. プロジェクトをビルドします。これにより、libAssmeblyCodeLinkObjects.so ファイルがビルドされます。
    1. AssemblyCode-Link-Objects.sln ファイルを開きます。
    2. メニューで、[Build] > [Build Solution] をクリックします。
  3. 関数が Android ライブラリに正しくエクスポートされることを確認するには、nm.exe NDK ツールを使用します。
    1. コマンドラインで、サンプル ディレクトリに移動します。
    2. ビルドで生成された Android ライブラリの場所に移動します。デフォルトの場所は、arm64-v8a プラットフォームの $sample_dir\$solution_configuration\$solution_platform\$platform$sample_dir\Debug\Android-arm64-v8a\arm64-v8a とほぼ同じです。
    3. 次のコマンドを実行して、エクスポートされたシンボル セクションに関数が含まれていることを確認します。
        …\ndk\toolschains\llvm\prebuilt\windows-x86_64\aarch64-linux-android\bin\nm.exe --defined-only …\Debug\Android-arm64-v8a\arm64-v8a\libAssmeblyCodeLinkObjects.so
      

      出力には、次のようなシンボルのリストが表示されます。

         T from_shared_object_assembly_code_as
         T from_static_lib_assembly_code_as