Android NDKを使用する

Android NDKを使用してみたいと思います。

4×4ピクセルのブロックのRGBの平均値を返すコードをAndroid NDKを使用して記述してみます。

まずは、ダウンロードします。ここです。

http://developer.android.com/sdk/ndk/index.html

Javaコードを書きます。

public class AndroidNdkActivity extends Activity {

	// NDKのライブラリのロード
	static {
		System.loadLibrary("ndklib");
	}
	private native static int returnAve(int array[],int width,int height);

	// 入力データ
	private int[] input =  {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

	/** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // NDKをコールする
        int ave = returnAve(input,4,4);

    }
}

この段階でndklibもreturnAveも中身が無いのでこれらを作成します。
まずトップディレクトリにnkdのコードを配置するためのjniディレクトリを起きます。その中にAndroid.mkとC/C++のソースコードを配置します。
Android.mkは以下です。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# ライブラリ名
LOCAL_MODULE    := ndklib
# ソースファイル名
LOCAL_SRC_FILES := ndklib.cpp
# 共有ライブラリとして指定する
include $(BUILD_SHARED_LIBRARY)

C++のコードは以下で。関数名は「パッケージ名+クラス名+関数名」と記載します。C++の場合はextern Cが必要です。

#include
#include

// 大事な宣言。C++を使用したい場合は必ずexternしておく。
extern "C" {

/**
 * 	@param	in	jintArray	src		画像のRGBのバイト配列
 *	@param	in	jint		width	画像の横幅
 *	@param	in	jint		height	画像の縦幅
 *	@return	out jint		result	計算された平均RGB
 */
jint Java_com_wordpress_takahir3_androidndk_AndroidNdkActivity_returnAve(
												JNIEnv* env,
												jobject thiz,
												jintArray src,
												jint width,
												jint height
												){
	int i, sum_red, sum_green, sum_blue;
	int num, ret;
	num = width * height;

	// NDK内でsrcを扱うためにメモリの確保
	jint* pixels=env->GetIntArrayElements(src,0);

	// 計算
	for (i = 0; i < num; i++) { 		sum_red += (pixels[i] & 0x00FF0000) >> 16;
		sum_green += (pixels[i] & 0x0000FF00) >> 8;
		sum_blue += (pixels[i] & 0x000000FF);
	}

	// 平均値の計算
	ret = (sum_red << 16) | (sum_green << 8) | sum_blue;	 	// NDK内で確保したメモリの解放										 	env->ReleaseIntArrayElements(src, pixels, 0);

	return ret;
}

}

ビルドします。ターミナルなどを開いてProjectのトップディレクトリに移動し、[ndk-build]コマンドを実行します。インストールしたndkフォルダに入っています。

成功するとlibndklib.soが出来上がります。eclipse上から見るとlibsフォルダが自動的に作られてその中に配置されます。

あとはNDKを使用しない場合と同じように実行すればアプリが動きます。この時、異常終了するようなら関数名見直したり、引数を見直したりしてみてください。logcatを見るのも有効です。

カテゴリー: iPhone パーマリンク

コメントを残す