トップページ>>用語集

akjava Android情報
流しギャラリー

スタートフォト



Loading...




Android NDK

アンドロイド エヌディケー


公式サイト:http://developer.android.com/sdk/ndk/1.6_r1/index.html

コミュニティー(英語):http://groups.google.com/group/android-ndk


NDKのメリットとデメリット

Nativeはとにかく速いです。GCも起きません。物理エンジンとか作るには必須です。

(実はAndroidの内部の多くはNative)

今はまだ限られた部分しかNativeで扱えませんが、将来的にはNativeだけでアプリも作れそうです。




欠点は初心者にも物凄く敷居が高い所です。

ただ、英語コミュニティーの方で初期の不具合はほとんど解決していますので、日本のコミュニティーで質問されても解決できると思います。


NDKのバージョンは

今のところ、最初のNDK1.5とOpenGL ES1.1に対応したNDK1.6r1があります。


Android NDKの導入

英語もLinuxも苦手なら難しいです。

公式サイトやNDKに含まれている各種ドキュメントをよく読みましょう。


NDKインストール

ここではNDK1.6r1のインストールの仕方を説明します。

NDKの場所は、どこでもいいです。私は今はC:\android-sdk-windowsの中にいれています。

Cygwinのインストール

以下のようなサイトを参考にCygwinをインストールします

http://musashi.sourceforge.jp/cygwin/cygwin.html


gccやmakeとか入れます。

この時に、ついでにgit入れるとAndroidのコードとかGetしやすくなって便利ですよ。


host-setup.sh

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.



hello-jni

他のこと始める前に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-windows\android-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


Android NDKとCDTの連携

NDK1.5の時に書いたドキュメントです。


英語がわかれば、Doug Schaeferさんのページだけでできるようになります。

http://github.com/dschaefer/android-box2d/tree/master


以下私がはまった所を書いていこうと思います。

javahを覚えておきましょう。

自分でclass書くときに必要になります。最小限覚えておきましょう。

gitでダウンロード

gitの使い方を見ましょう、私はここがわかりやすかったです。http://www8.atwiki.jp/git_jp/pub/Documentation.ja/user-manual.html

gitはcygwinインストール時に入れると楽でした。

CDTのインストール

CDTというC/C++開発用のプラグインを別途入れます。

コンパイルの仕方

ダウンロードするとbox2dとTestBox2Dがあります。

まずはbox2dをコンパイルします。普通のCDTプロジェクトなので普通にbuildできるでしょう。

EnvironmentでPATHにc:\cygwin\binを追加します。

このbox2dはlibbox2d.aというライブラリーを生成します。以後box2dを使ったProject(TestBox2Dなど)はこのlibbox2d.aを使います。

なので最初にコンパイルする必要があります。


次にTestBox2Dをコンパイルします。これはすでにAndroid + CDTとして完成していますので、EnvironmentでPATHにc:\cygwin\binを追加で動くと思います。


AndroidプロジェクトをCDTにする

まずは、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使っています。なので説明のメニュー名とか英語です。

box2dを絶対パスで指定する

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


LIBNAMEに注意

Javaから System.loadLibrary("hello-jni");と呼び出す場合

最初にlib、最後に.so付けた名前を指定します。

LIBNAME = libhello-jni.so


Javaに値を入れるときは

警告が出ますので(jfloat)とかキャストしましょう。

env->CallVoidMethod(bodyInfo, setValuesId, (jfloat)body->GetLinearVelocity().x, (jfloat)body->GetLinearVelocity().y);


Includesが消滅したときは

.cprojectを削除して最初からやり直しましょう。


-DTARGET_FLOAT32_IS_FIXEDを外す場合

box2dの方も外して再buildします。でないとメソッドが無いエラーがでます。


ちなみに、私は私のライブラリーがフリーズするので外しています。

でも固定小数点の方が断然速いらしいです。

libsにオレンジの!マークが出たら

これはSVNの関係で出ます。気にしないこと


hello-jniをCDTするには

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 !");
}

}

NDK プロジェクト

物理エンジン

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