サンプル: Teapot

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 を使用して、マトリックスを計算したり、ユーザーがタップした場所に基づいてカメラを再配置したりします。