NDK入門、向上と実戦


ネットでもNDKについての紹介がありますが、全部簡単にsampleの中の例を説明してみます.詳しくはないです.ここで私の所得を分かち合います.私はAndroid Native Developer Kit(NDK)R 4バージョンをダウンロードしました.最新版です.    ダウンロード先は以下の通りです.    http://dl.google.com/android/ndk/android-ndk-r4b-linux-x86.zip
 
    私が以下に話したのはlinux環境を基準としています.私のシステムはlinuxです.windowsの下でCygwinをいじることができて、linux環境を模擬して、ネット上で多くの紹介があります.    まず、ndkディレクトリに入ると、READMEファイルがあります.APIの文書はdocs/STABLE API S.TXTの中にあります.NDKはどうやってインストールしますか?docs/INSTALL.TXTを参考にして、NDKはどうやって使用しますか?docs/HOWT.TXTを参照してください.これらの文書を全部読んでください.大体の理解があります.
 
    インストール:    INSTALL.TXTの中では、NDKをインストールするには、make環境が必要です.linuxは自分で持っていますので、気にしないでください.もう一つは、以前のバージョンはすべてbuild/host-setup.shを実行して初期化を行う必要があります.このバージョンはそれを削除して、より便利です.    環境変数を設定します.    をファイルに追加します.   
NDK_ROOT=~/android-ndk-r4b #      NDK     ,         
export NDK_ROOT
 
    保存して、もう一度bashを開けます.
 
    使用:    とりあえずサンプルを持ってみてください.最初は何も分かりませんでした.一例を実行してこそ、自信がつきます.    コンパイルの2つの方法:    1.目的のプロジェクトディレクトリに入る.例えば$NDK_ROOT/samples/hello-jniを実行します.ROOT/ndk-build    2.どこでも$NDK_を実行します.ROOT/ndk-build-C$NDK_ROOT/samples/hello-jni.    成功すれば、Objとlibsの二つのディレクトリが生成されます.    この例をコンパイルする方法を選択します.その後、eclipseを開けて、ハローjniというプロジェクトを導入して、運行して、okして、効果が見られます.
 
    ステップ:    docsのSTABL E API S.TXTでは、システムAPIの使い方を説明しています.私は1.5を例にします.に入りますROOT/build/plotforms/android-3/arch-arm/usr/includeにはたくさんのファイルがあります.hファイルは、これらはNDKで呼び出すことができます.Linuxとasmディレクトリを除いて.    一般的には、jni.hが主に使われていますが、中には多くの種類や対象に対する操作が提供されています.    また、1.5はlogのAPIを提供しています.Android/log.hの中で、使う時はcファイルの中にLOCALを入れます.LDLIBS:=-llagでいいです.    1.6から2.01までopenGL ES 1.xのAPIを提供し、2.1はopenGL ES 2.0のAPIを提供し、2.2はgraphicsの処理インターフェースを提供している.使い方はロゴと同じです.
 
    例:    二つの点の座標を与え、距離を求める.    まず、Pointオブジェクトを作成します.   
public class Point {
	float x;
	float y;
}
 
    Cファイルで関数を定義します.   
jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b){}
 
    戻り値はfloatで、jniで定義されているのはjfloatです.
    関数名のルール:Javaの先頭には、パッケージ名の各セグメントが続き、クラス名、最後にJavaで呼び出されたメソッド名があり、中間はすべて下線で区切られています.最初のパラメータJNIEnv*envと第二のパラメータjobject thizは必須であり、後はJavaから渡されるパラメータです.ここは二つのPointオブジェクトです.
    まずやるべきステップを確定します.    1.このPoint類を見つけます.    2.クラスのドメインxとyのドメインIDを見つける    3.IDからxとyの値を取り出す    4.計算結果を返します.    コードは以下の通りです.
#include <jni.h>
#include <math.h>
#include <android/log.h>

jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b)
{
        //  1
	jclass point_class = (*env)->FindClass(env, "chroya/demo/ndk/Point");
	if(point_class == NULL) {
		//printf("class not found");
		__android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "class Point not found");
		return 0;
	} else {
		__android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "found class Point");
	}
        //  2
	jfieldID field_x = (*env)->GetFieldID(env, point_class, "x", "F");
	jfieldID field_y = (*env)->GetFieldID(env, point_class, "y", "F");
        //  3
	jfloat ax = (*env)->GetFloatField(env, a, field_x);
	jfloat ay = (*env)->GetFloatField(env, a, field_y);
	jfloat bx = (*env)->GetFloatField(env, b, field_x);
	jfloat by = (*env)->GetFloatField(env, b, field_y);
        //  4
	return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2));
}
     その後、Javaで呼び出します.
public class Main extends Activity {
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(getApplicationContext());
        Point a = new Point();
        a.x = 3;
        a.y = 3;
        
        Point b = new Point();
        b.x = 5;
        b.y = 5;
        
        float d = distance(a,b);
        tv.setText("distance(a,b):"+d);
        setContentView(tv);
    }
    
    public native float distance(Point a, Point b);
    
    static {
    	System.loadLibrary("demo");
    }
}
      実行、結果distance(a,b):2.828427
      ソースは添付ファイルを参照してください.