このエントリーをはてなブックマークに追加
>> Android用語集

Android NDK(アンドロイド エヌディケー)

現在

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

R9までリリースされました。当初のARM以外もサポートされています。

Android黎明期(2008-2010)

コミュニティー(英語):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-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

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:cygwinbinを追加します。 このbox2dはlibbox2d.aというライブラリーを生成します。以後box2dを使ったProject(TestBox2Dなど)はこのlibbox2d.aを使います。 なので最初にコンパイルする必要があります。

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

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


関連サイト
www.akjava.com | github.com/akjava
Copyright (C) 2008-20014 Aki Miyazakion Google+ All Rights Reserved.