今回はAndroid NDKに含まれるサンプルプロジェクト「bitmap-plasma」を見てみる。このプロジェクトはネイティブコードからの画面描画を行うサンプルだ。
EclipseでAndroidプロジェクトを作成する。その際に、「Create project from existing source」をチェックして、Android NDKのサンプルフォルダにある「bitmap-plasma」を指定する。
これでEclipseに「bitmap-plasma」プロジェクトが取り込まれた。
ネイティブコードのビルドにわざわざCygwinを開くのは面倒なので、プロジェクトフォルダ内にEasyProjectGeneratorにあるビルド用のバッチファイルをコピーしておく。
jniフォルダ内にApplication.mkというmakeファイルがある。これは不要っぽいので削除した。(本当は必要なのかもしれませんが、、、)
そしてndk-buildによりネイティブコードをビルドする。
これでAndroidエミュレーターでサンプルプロジェクトが実行された。
サンプルソースコードを少し見てみる。Plasma.javaのOnDraw()内でネイティブの描画処理が呼ばれている。また描画後すぐにinvalidate()が呼ばれるために描画領域が無効化されて再描画していた。
次にネイティブコードのplasma.cを見てみる。メイン処理の中では、javaから渡された引数をAndroidBitmap_lockPixels()によりメモリとして取得、AndroidBitmap_unlockPixels()により開放、その間に描画がされていた。
さらに見ると、AndroidBitmap_lockPixels()により取得したメモリには、x方向のピクセルデータ1列をfor()によりy軸方向に回していた。別に疑っていた訳ではないが、本当にベタなピクセルデータとしてネイティブ側からアクセスできるようだ。