読者です 読者をやめる 読者になる 読者になる

Happy My Life

日常とか技術とか

Android NDK r5バージョンアップまとめ

Android

ってことで、GingerBread(Andoid 2.3)対応Android SDKのリリースと同時にAndroid NDK r5もリリースされた。

新しいAndroid SDKについては、他の方がいろいろまとめているのでそちらを見てもらうとして、こちらはAndroid NDKr4からAndroid NDKr5で変化した事をまとめてみた。

バージョンアップ概要

Android NDKr5へのバージョンアップで大きく変化した事は大きく分けて3つ。他にも多数の変化があるけど、とりあえずは、これだけ押えておけばよいかと。

では、これらについて詳細を解説していく。

C/C++だけでAndroidアプリが作成可能

Android NDKr5では、APILevel 9(Android 2.3)からNative Activityが導入された。文字通りネイティブなコードで呼びだせるActivityってこと。Androidアプリの基本であるActivityがC/C++から呼び出せるという事は、C/C++だけでAndroidアプリケーションが作成できるようになった事を意味する。

ただし、ListViewなどAndroid Frameworkを利用する際は、JNIを通してアクセスしなければならない。あと、SandBox内でアプリケーションが動作する原則も引き続き採用されているので、「C/C++で作成したアプリケーションが落ちたら、OSごと落ちた」という事も発生しない。このあたりは今まで通り。

詳細は、android-ndk-r5/doc/native-activity.html、android-ndk-r5/platforms/android-9/arch-arm/usr/include/android/native_activity.hを参照のこと。

NDKだけで作ったアプリの方が高速で動くんでね?

という発想も当然出てくる。ただ、これは必ずしもYesとは言えない。Android Frameworkは必ずJNIを経由するので、そのオーバーヘッドが吸収できるくらい高速化できれば有効である。やたら計算量が多いアプリであれば高速化されるだろうが、UIを駆使するユーティリティ系アプリだと目に見えたメリットは無いはず。

ちなみに、C/C++なコードで不正な処理が発生した場合は、Javaで開発していた時のような例外は表示されず、大抵は「Segment fault」でいきなり終了するので、慣れてないとJavaよりデバッグが大変という事も付け足しておく。

ゲーム制作に特化したNative Activityが登場

先のNative Activityに関係するのだが、Native Activityをゲーム向けに大幅に機能拡張した「android_native_app_glue.h」が提供された。

どう拡張されているかというと、C言語で言うMain関数に相当する、android_main関数が登場した。android_main関数では、他プラットフォームでゲームを作成する場合と同じく、ゲームの初期化、ゲームシーンの遷移など、ゲームに関する一切の処理はこの関数で制御することができる(要はいままでのゲーム制作の手法と同じようにできるってこと) なので、今までActivityの制御で利用したonCreateなどを利用して初期化などする必要がない。

あと、ゲームに特化したイベントがシステムに組み込まれている。LowMemoryなものから、レジューム、ポーズ、ゲームの設定の変化など、ゲーム特有のものまで、イベントが発生発生時にそれらのイベントに対応したユーザ関数を呼びだす事ができる。

これらは、サンプルアプリが/android-ndk-r5/samples/native-activityフォルダ にあるので、そこを見た方が早いかと。そのうち詳細を解説するかも。

また、その元となったandroid_native_app_glue.hはandroid-ndk-r5/sources/android/native_app_glueフォルダにある。

サウンド制御が可能に

以前のバージョンのAndroid NDKr4b では、OpenGL|ESが、NDKから呼び出せるようになっていたが、Android NDKr5では、サウンド制御もできるようになった。これでNDKだけでゲームが作れるライブラリ環境が整った事になる

サンプルコードは、android-ndk-r5/samples/native-audioフォルダにある。

STLportの導入

Android NDKでC++の標準ライブラリであるSTL(Standard Template Library)を利用する時は、STLportを使うのだが、以前のAndroid NDKr4では自分でSTLportを組み込むしかなかった。これが、今回のAndroid NDKr5では、STLportを組み込むかどうかをオプションで指定できるようになった。組み込み事できるし、今まで通り組み込まない事もできる。

組み込む手間が減ったという事より、STLportGoogle公認になったというメリットの方が大きいのではないだろうか。

詳細はandroid-ndk-r5/doc/cplusplus-support.htmlに書いてある。

例外/RTTIが利用可能に

Android NDKr4では例外/RTTIが利用できなかったのだが、今回のAndroid NDKr5では利用できるようになった。ただ、デフォルトでは無効にされているので、これをコンパイラのオプションで有効にする必要がある。

例外を利用する場合
LOCAL_CPPFLAGS += -fexceptions
RTTIを利用する場合
LOCAL_CPPFLAGS += -frtti

雑感

今回のバージョンアップは、Androidをよりゲームプラットフォームに近づけるための対応がメインかと思われる。

このAndroid NDKr5で、よりAndroidプラットフォームでのゲーム制作がしやくすくなった。これを元にAndroidで動作するゲームが拡充する事を願うのみ。

ただ、Android NDKr5は、ゲームやろうぜ by GMOで利用されているVIVID Runtime SDKと仕組みやライブラリの内容は大差が無い。あとは、パブリッシャ(開発者)がどちらの開発プラットフォームを選択するか…。