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を見るのも有効です。