Teapot のサンプルは、NDK のインストール ルート ディレクトリの下の samples/Teapot/ ディレクトリにあります。このサンプルでは、OpenGL ライブラリを使用して CG の世界ではおなじみのユタ ティーポットをレンダリングします。このサンプルでは特に ndk_helper ヘルパークラスを紹介していますが、これはゲームやそれに似たアプリをネイティブ アプリとして実装するために必要となるネイティブ ヘルパー関数の集まりです。このクラスは次のものを提供します。
- NDK 固有の動作のいくつかを処理する抽象化レイヤ
GLContext - タップ検出など、NDK には含まれていない有用なヘルパー関数
- テクスチャ読み込みなどのプラットフォーム機能を JNI で呼び出すためのラッパー
AndroidManifest.xml
ここでのアクティビティ宣言は、NativeActivity そのものではなく、そのサブクラスである TeapotNativeActivity です。
<activity android:name="com.sample.teapot.TeapotNativeActivity" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
最終的にビルドシステムでビルドされる共有オブジェクト ファイルの名前は、libTeapotNativeActivity.so になります。ビルドシステムが接頭辞 lib と拡張子 .so を追加するため、マニフェストで最初に android:value にセットする値には接頭辞も拡張子も付けません。
<meta-data android:name="android.app.lib_name" android:value="TeapotNativeActivity" />
Application.mk
NativeActivity フレームワーク クラスを使用するアプリでは、このクラスが導入された Android API レベル 9 以上を指定する必要があります。NativeActivity クラスの詳細については、ネイティブ アクティビティとアプリをご覧ください。
APP_PLATFORM := android-9
次の行で、ビルドシステムに対して、サポート対象のすべてのアーキテクチャ向けにビルドするよう指定します。
APP_ABI := all
このファイルでは次に、ビルドシステムに対して、使用する C++ ランタイム サポート ライブラリを指定します。
APP_STL := stlport_static
Java サイドの実装
TeapotNativeActivity ファイルは、GitHub の NDK リポジトリ ルート ディレクトリの下の teapots/classic-teapot/src/com/sample/teapot にあります。このファイルは、アクティビティのライフサイクル イベントを処理し、ポップアップ ウィンドウを作成して ShowUI() 関数を使ってテキストを画面に表示し、updateFPS() 関数を使ってフレームレートを動的に更新します。次のコードでは、レンダリングされたティーポット フレームを表示する際に画面全体が使用されるように、アプリのアクティビティを「全画面、没入型、システムのナビゲーション バーなし」として準備している点に注目してください。
Kotlin
fun setImmersiveSticky() { window.decorView.systemUiVisibility = ( View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE ) }
Java
void setImmersiveSticky() { View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); }
ネイティブ サイドの実装
このセクションでは、Teapot アプリのうち C++ で実装されている部分について説明します。
TeapotRenderer.h
下記の関数呼び出しは、ティーポットの実際のレンダリングを行います。ndk_helper を使用して、マトリックスを計算したり、ユーザーがタップした場所に基づいてカメラを再配置したりします。