2011.11.08

【Android】Android NDKの使い方

ちょいと気になったのでしらべてみた。

Link:Android NDK | Android Developers

なぜこんなものがあるのか

Android SDKでいいじゃんと思いますが、だいぶ動作が重いらしい。
どこかのうわさで10倍くらい速度が違うと聞いたことがあります。

Android NDKのNはネイティブの略でよりコアに近いところで書くことで
高速に動作させることができるらしい。

大まかな流れは起動はjavaで行い、負荷の高いところをJNIを通してC/C++で記述する形になる。

いかんせん、C/C++で動作するので速いわけだけどメモリ監理をしっかりしないとあっさりとまりそう。

前準備

1. Android NDKのダウンロードとインストール

以下ところからNDKを拾ってくる
Link:Android NDK | Android Developers

それをどこかへ配置しておく

これはSDKと同じ流れ

2. cygwinにNDKへのパスを追加する。

.bashrcに以下のものを追加

export ANDROID_NDK_ROOT=(NDKのインストールパス)
export PATH=$PATH:$ANDROID_NDK_ROOT

ndk-buildを実行できるような状況を作成します。

cygwinのインストール方法は省略。
とりあえずmakeくらいは必要になる。

NDKのプロジェクトの呼び出し方

1. 普通にAndroidプロジェクト作成
いつもどおりにAndroidプロジェクトを作成します。
jniのことを考えてアンダーバーは含まないほうがいいと思います。

2. jniディレクトリの作成
ルートディレクトリにjniディレクトリを作成します。

3. Android.mkを作成する
jniディレクトリの中にAndroid.mkを作成します。

内容はこんな感じ

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := (プロジェクト名)
LOCAL_SRC_FILES := (プロジェクト名).c

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULEはプロジェクト名必須かもしれないけど
LOCAL_SRC_FILESはリンクさせると思うので適当な名前でいいと思う。

4. SDKから呼び出される関数を作成する。
(プロジェクト名).cを作成し処理を記述する。

とりあえず今回は適当な文字列を返す関数を作成する。

test.jni.JnitestActivityクラスのstringFromJNI関数を作るときは以下のようになる。

#include <string.h>
#include <jni.h>

jstring Java_test_jni_JnitestActivity_stringFromJNI( JNIEnv* env, jobject thiz )
{
    return (*env)->NewStringUTF( env, "pyo" );
}

頭にJavaをつけてすべてをアンダーバーで結合したような関数を作成します。

5. JNIライブラリのロードする
JNIで呼び出すには事前にロードする必要があるらしい。

Javaの方に戻りメインのActivityに以下のものを追加する。

	static
	{
		System.loadLibrary("(プロジェクト名)");
	}

staticを使いクラスがロードされたと同時にJNIライブラリをロードするようにする。

6. Java側の呼び出し関数を作成

Activityに以下のものを追加する。

	public native String  stringFromJNI();

nativeをつけることでJNIから探し出す仕組みになっているっぽい。

んで、Logなどで表示する処理を入れておく。

コンパイル

1. JNIライブラリのコンパイル

cygwinを立ち上げてAndroidアプリのルートディレクトリまで移動します。

そして以下のコマンドを実行します。

$ ndk-build

2. EclipseにJNIライブラリの更新を認識させる
普通に更新しただけではJNIライブラリが変更されたとは認識してくれないようです。

なので変わったよと教えてあげます。

パッケージ・エクスプローラでプロジェクトルートをクリックしてF5を押します。

3. 実行
いつもと同じように実行するといい感じに動いているはずです。

今後の課題

・JNIライブラリのコンパイルがめんどい
いちいち画面切り替えたりで面倒。

MacであればEclipseの設定をうまくすることで自動的に更新も可能らしい。
Link:EclipseからAndroid NDKのコードをビルドする : Happy my life

問題はcygwin経由で行うところなので何かいい案があったら試してみたい。

・デバッグってどうやるの?
やり方がわからん。

こんな感じでやるようだけれど資料が古いせいかうまくいかず。
Link:なんとなく実験 with SIProp開発記 | Android NDKのデバッグ手法

最悪、printfという手もあるのでできたらラッキーくらいに考えておきましょう。

注意点

・CPU依存がある
現在のNDKはCPUがARMでないと使用できないらしい。
今後X86系のCPUが出たときには非対応にせざるを得ない。

参考資料

アンドロイド開発環境の構築(その5) NDKのインストールと設定 (UsefullCode.net)
Android JNIプロジェクトをゼロから作る(UsefullCode.net)

ワーキンググループ/ハンズオンセッション/NDK概要 - 日本Androidの会(日本アンドロイドの会)

Androidプログラミング-NDK-OpenGL - tueda

組込みプレス Vol.16 組込みプレス Vol.16
組込みプレス編集部 B5

技術評論社 2009-08-28
売り上げランキング : 350284

Amazonで詳しく見る by G-Tools

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

関連記事

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>