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
サンプルを設定して実行する手順は次のとおりです。
- Visual Studio で、HelloJNI サンプルを開いてビルドします。
- Android arm64-v8a プラットフォームを追加します。詳しくは、Android プラットフォームの追加をご覧ください。
- 新しいプラットフォームに Android APK アイテムを追加します。
- プロジェクトをコンパイルします。
- 次の Android プラットフォームを追加してから、それぞれに Android APK アイテムを追加します。Android-armeabi-v7a、Android-x86、Android-x86_64。
- サンプルをビルドして実行します。
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 で実行する手順は次のとおりです。
- GLEW をインストールします。
- GLEW をダウンロードして解凍します。
- バイナリ ファイルを
$your-glew-directory\bin\Release\x64
から%SystemRoot%\system32
にコピーします。
- freeglut をインストールします。
- freeglut をダウンロードして解凍します。
$your-freeglut-directory\bin\x86\freeglut.dll
を%SystemRoot%\system32
にコピーします。
- freeglut プロジェクトの依存関係を追加します。
- Visual Studio で
Teapot.sln
を開きます。 - メニューで、[Debug] > [x64] > [Local Windows Debugger] をクリックします。
- [Solution Explorer] で、[GameApplication] を右クリックして [Properties] > [C/C++] > [General] > [Additional Include Directories] を選択します。
$your-freeglut-dir\include
をパスに追加します。
- [OK] をクリックします。
- [Linker] > [General] > [Additional Library Directories] を選択します。
$your-freeglut-dir\lib\x64
をパスに追加します。- [OK] をクリックします。
- [Linker] > [General] > [Additional Library Directories] を選択します。
freeglut.lib
をパスに追加します。- [OK] をクリックします。
- Visual Studio で
- GLEW プロジェクトの依存関係を追加します。
- [Solution Explorer] ペインで、[GameApplication] を右クリックして [Properties] > [C/C++] > [General] > [Additional Include Directories] を選択します。
$your-glew-dir\include
をパスに追加します。- [OK] をクリックします。
- [Linker] > [General] > [Additional Library Directories] を選択します。
$your-glew-dir\lib\Release\x86
をパスに追加します。- [OK] をクリックします。
- [Linker] > [General] > [Additional Library Directories] を選択します。
glew32.lib
をパスに追加します。- [OK] をクリックします。
- サンプルを Windows で実行します。
- Visual Studio のツールバーで、[Local Windows Debugger] 実行ボタンをクリックします。
- サンプルは次のようになります。
AssemblyCode-Link-Objects
これはアセンブリ ソースコードと C / C++ ソースコードから Android ネイティブ ライブラリを生成する方法を示すテンプレート プロジェクトです。主なコンポーネントは次のとおりです。
AssemblyCode-Link-Objects
: C++ ソースコードおよびアセンブリ ソースコードからビルドされたメインの Android ネイティブ ライブラリ。StaticLib
:from_static_lib_assembly_code_as
関数をエクスポートするヘルパー静的ライブラリ。
プロジェクトでは複数のアーキテクチャがサポートされます。サポートされている各アーキテクチャには、StaticLib
からエクスポートされた関数を実装する独自のソースファイルがあります。ビルドするプラットフォームのアセンブリ ソースファイルのみを含める必要があります。このプロジェクトには、カスタム ビルドツールを使用したビルドでのアセンブリ ファイルが含まれています。
サンプルを設定してビルドする手順は次のとおりです。
- Visual Studio で、アセンブリ ファイルにカスタム ビルドツールが構成されていることを確認します。
- [Solution Explorer] でアセンブリ ファイルを右クリックし、[Properties] をクリックします。これにより、ファイルの [Properties Pages] ダイアログが開きます。
- Android-arm64-v8a の [All configurations] などの構成とプラットフォームを選択します。
- [General] > [Exclude from Build] が [No] に設定されていることを確認します。
- [General] > [Item Type] が [Custom Build Tool] に設定されていることを確認します。
- 適用する変更がある場合は [Apply] をクリックします。
- [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)
を使用してください。 - [Configuration Properties] > [Custom Build Tools] > [Outputs] が
$(IntDir)%(FileName).o
に設定されていることを確認します。この文字列は、コマンドライン設定に含める必要があります。 - [Configuration Properties] > [Custom Build Tools] > [Link Objects] が
Yes
に設定されていることを確認します。
たとえば、Android-arm64-v8a の設定は、次のスクリーンショットのようになります。
- プロジェクトをビルドします。これにより、
libAssmeblyCodeLinkObjects.so
ファイルがビルドされます。AssemblyCode-Link-Objects.sln
ファイルを開きます。- メニューで、[Build] > [Build Solution] をクリックします。
- 関数が Android ライブラリに正しくエクスポートされることを確認するには、nm.exe NDK ツールを使用します。
- コマンドラインで、サンプル ディレクトリに移動します。
- ビルドで生成された Android ライブラリの場所に移動します。デフォルトの場所は、arm64-v8a プラットフォームの
$sample_dir\$solution_configuration\$solution_platform\$platform
と$sample_dir\Debug\Android-arm64-v8a\arm64-v8a
とほぼ同じです。 - 次のコマンドを実行して、エクスポートされるシンボル セクションに関数が含まれていることを確認します。
…\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