2011年5月27日金曜日

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

GingerBread(Andoid 2.3)対応Android SDKのリリースと同時にAndroid NDK r5もリリースされた。
新しいAndroid SDKについては、他の方がいろいろまとめているのでそちらを見てもらうとして、こちらはAndroid NDKr4からAndroid NDKr5で変化した事をまとめてみた。

バージョンアップ概要
Android NDKr5へのバージョンアップで大きく変化した事は大きく分けて3つ。他にも多数の変化があるけど、とりあえずは、これだけ押えておけばよいかと。
C/C++だけでAndroidアプリが作成可能
ゲーム制作が、よりしやすくなった
toolchain(C/C++コンパイラ)の機能強化

では、これらについて詳細を解説していく。
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を組み込むかどうかをオプションで指定できるようになった。組み込み事できるし、今まで通り組み込まない事もできる。
組み込む手間が減ったという事より、STLportがGoogle公認になったというメリットの方が大きいのではないだろうか。
詳細はandroid-ndk-r5/doc/cplusplus-support.htmlに書いてある。

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

0 件のコメント:

コメントを投稿