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を実行して初期化を行う必要があります.このバージョンはそれを削除して、より便利です. 環境変数を設定します. をファイルに追加します.
保存して、もう一度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オブジェクトを作成します.
Cファイルで関数を定義します.
戻り値はfloatで、jniで定義されているのはjfloatです.
関数名のルール:Javaの先頭には、パッケージ名の各セグメントが続き、クラス名、最後にJavaで呼び出されたメソッド名があり、中間はすべて下線で区切られています.最初のパラメータJNIEnv*envと第二のパラメータjobject thizは必須であり、後はJavaから渡されるパラメータです.ここは二つのPointオブジェクトです.
まずやるべきステップを確定します. 1.このPoint類を見つけます. 2.クラスのドメインxとyのドメインIDを見つける 3.IDからxとyの値を取り出す 4.計算結果を返します. コードは以下の通りです.
ソースは添付ファイルを参照してください.
私が以下に話したのは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ソースは添付ファイルを参照してください.