Android用語集
公式サイトhttp://developer.android.com/tools/sdk/ndk/index.html
R9までリリースされました。当初のARM以外もサポートされています。
コミュニティー(英語):http://groups.google.com/group/android-ndk
Nativeはとにかく速いです。GCも起きません。物理エンジンとか作るには必須です。 (実はAndroidの内部の多くはNative) 今はまだ限られた部分しかNativeで扱えませんが、将来的にはNativeだけでアプリも作れそうです。
欠点は初心者にも物凄く敷居が高い所です。 ただ、英語コミュニティーの方で初期の不具合はほとんど解決していますので、日本のコミュニティーで質問されても解決できると思います。
今のところ、最初のNDK1.5とOpenGL ES1.1に対応したNDK1.6r1があります。
英語もLinuxも苦手なら難しいです。 公式サイトやNDKに含まれている各種ドキュメントをよく読みましょう。
ここではNDK1.6r1のインストールの仕方を説明します。 NDKの場所は、どこでもいいです。私は今はC:android-sdk-windowsの中にいれています。
以下のようなサイトを参考にCygwinをインストールします http://musashi.sourceforge.jp/cygwin/cygwin.html
gccやmakeとか入れます。 この時に、ついでにgit入れるとAndroidのコードとかGetしやすくなって便利ですよ。
CygwinからCygwin Bash Shellを開きます。 NDKをインストールした場所へ移動します。
以前にNDK1.5とかインストールしていたりする場合、 export ANDROID_NDK_ROOT= に値があると、そちらが優先されてしまいますので、コメントアウトします。
そして、buildの中に有るhost-setup.sh を実行します。 それ以外の場所からだとNDKへ移動しろというエラーが出ます
成功するとこういうメッセージが出ます
Checking host development environment.
NDK Root : /cygdrive/c/android-sdk-windows/android-ndk-1.6_r1
GNU Make : make (version 3.81)
Awk : awk
Platform : windows
Generate : out/host/config.mk
Toolchain : Checking for arm-eabi-4.2.1 prebuilt binaries
Host setup complete. Please read docs/OVERVIEW.TXT if you don't know what to do.
他のこと始める前にcygwinからのサンプルのコンパイルは試しておこう
同じNDKのホームから、 make APP=hello-jniとします。
うまくいくとこのようなテキストになります。(これは絶対パスに書き換えたものなので表示は異なっています)
Android NDK: Building for application 'hello-jni'
Compile thumb : hello-jni <= /cygdrive/c/android-sdk-windows/android-ndk-1.6_r1/apps/hello-jni/project/jni/hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => /cygdrive/c/android-sdk-windows/android-ndk-1.6_r1/apps/hello-jni/project/libs/armeabi
2回目、同じコマンドを実行すると、以下のようにでますが、これは変更することがないという意味です
Android NDK: Building for application 'hello-jni'
make: Nothing to be done for `all'.
古いのを消して最初からやり直したい場合は make APP=hello-jni clean という風にやり直します。
サンプルは、両方同じフォルダーにありましたが、 実際にはプロジェクトにjniというフォルダーを作成してその中にNativeコードを置いて そのNativeコードの指定をNDKホームのappsの中に分けて置きます。
Windowsの場合、Application.mk中のAPP_PROJECT_PATHのパスの書き方に気をつけます。
APP_PROJECT_PATH := C:android-sdk-windowsandroid-ndk-1.6_r1 はがメタなのでぜんぜんだめです。
APP_PROJECT_PATH := C:\android-sdk-windows\android-ndk-1.6_r1\apps\hello-jni\project ですと、以下のようなエラーが出ます。
build/core/build-binary.mk:123: *** target pattern contains no `%'. Stop.
APP_PROJECT_PATH := /C:/android-sdk-windows/android-ndk-1.6_r1/apps/hello-jni/project/
ですと
Android NDK: There is no Android.mk under /C:/android-sdk-windows/android-ndk-1.6_r1/apps/hello-jni/project/jni
Android NDK: If this is intentional please define APP_BUILD_SCRIPT to point
Android NDK: to a valid NDK build script.
build/core/add-application.mk:97: *** Android NDK: Aborting... . Stop.
正解は、cygdraiveという特殊なパスの書き方になります。 /cygdrive/c/android-sdk-windows/android-ndk-1.6_r1/apps/hello-jni/project/
http://monoist.atmarkit.co.jp/fembedded/articles/android/02/android02a.html http://d.hatena.ne.jp/bs-android/20090707/1246952991 http://www.noritsuna.com/archives/2009/09/android_ndk.html
NDK1.5の時に書いたドキュメントです。
英語がわかれば、Doug Schaeferさんのページだけでできるようになります。 http://github.com/dschaefer/android-box2d/tree/master
以下私がはまった所を書いていこうと思います。
自分でclass書くときに必要になります。最小限覚えておきましょう。
gitの使い方を見ましょう、私はここがわかりやすかったです。http://www8.atwiki.jp/git_jp/pub/Documentation.ja/user-manual.html gitはcygwinインストール時に入れると楽でした。
CDTというC/C++開発用のプラグインを別途入れます。
ダウンロードするとbox2dとTestBox2Dがあります。 まずはbox2dをコンパイルします。普通のCDTプロジェクトなので普通にbuildできるでしょう。 EnvironmentでPATHにc:cygwinbinを追加します。 このbox2dはlibbox2d.aというライブラリーを生成します。以後box2dを使ったProject(TestBox2Dなど)はこのlibbox2d.aを使います。 なので最初にコンパイルする必要があります。
次にTestBox2Dをコンパイルします。これはすでにAndroid + CDTとして完成していますので、EnvironmentでPATHにc:cygwinbinを追加で動くと思います。
まずは、Androidプロジェクトを新規からConvert to C/C++ Projectします。 そして、設定のC/C++ BuildからGenerate Makefiles automatically のチェックを外します。(これはずさないとDebugとかフォルダー作ってそこでbuildが動きます) nativeというフォルダー作って、それを設定のC/C++ BuildのPath and Symbolsのsource folderに追加します。
そして、TestBox2DのMakefileをコピーします。
日本語版だと不安定なので私は英語版のままEclipse使っています。なので説明のメニュー名とか英語です。
Makefileを以下のように絶対パスでしています。NDKの場所が違う場合もNDK_BASEの所を書き換えます。 CFLAGS = -O2 -DTARGET_FLOAT32_IS_FIXED -I/cygdrive/C/cygwin/var/tmp/gits/android-box2d/box2d/Include LIBS = -L/cygdrive/C/cygwin/var/tmp/gits/android-box2d/box2d/lib/android -lbox2d
Javaから System.loadLibrary("hello-jni");と呼び出す場合 最初にlib、最後に.so付けた名前を指定します。 LIBNAME = libhello-jni.so
警告が出ますので(jfloat)とかキャストしましょう。 env->CallVoidMethod(bodyInfo, setValuesId, (jfloat)body->GetLinearVelocity().x, (jfloat)body->GetLinearVelocity().y);
.cprojectを削除して最初からやり直しましょう。
box2dの方も外して再buildします。でないとメソッドが無いエラーがでます。
ちなみに、私は私のライブラリーがフリーズするので外しています。 でも固定小数点の方が断然速いらしいです。
これはSVNの関係で出ます。気にしないこと
Cだとうまくいかないみたい。C++に書き直しましょう。
#include <string.h>
#include <jni.h>
extern "C" {
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
*/
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv *env,
jobject thiz )
{
return env->NewStringUTF("Hello from JNI !");
}
}
Box2DのNDK - http://github.com/dschaefer/android-box2d/tree/master 私が公開しているBox2DのNDK - http://code.google.com/p/akjava-android-project/wiki/Box2dUnderNDK 3D物理エンジン BulletのNDK - http://www.noritsuna.com/archives/2009/08/bullet_for_andr.html
Wrapper scripts and STL support for Android NDK STLを使えるようにしたもの? - http://umbel.mooo.com/
OpenCV Ver.1.1 For Android NDK - http://www.noritsuna.com/archives/2009/09/opencv_ver11_fo.html かっこいい プラズマデモ - http://android.g.hatena.ne.jp/keigoi/20090902