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くらいは必要になる。
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 組込みプレス編集部 B5 技術評論社 2009-08-28 |
関連記事