・2010/08/13
Google Android JNI NDKの C/C++言語開発環境の構築のつもり
(Android JNI NDKで C言語の Native関数を作って処理速度を高速化)
Tags: [Android開発]
単純な計算部分など Cに置き換えして高速化が見込めそうな部分を Android NDKで作ります。
JNI:Java Native Interface
●必要なソフトウェア
Android NDK
Android NDK
Windows android-ndk-r4b-windows.zip 45MB
Cygwin
Cygwin
http://www.cygwin.com/setup.exe
Cygwin 1.7.5
●NDK環境の構築
Android NDKの ZIPを適当に解凍する。
ここでは
D:\Android\android-ndk
に解凍する。
Cygwinをインストールする。
Cygwinの選択画面で Devel(開発)の GCCと MAKEを選択する。
選択画面の次の画面で「これらも必要だけどインストールする?」が出るので一緒にインストールする。
セットアップ完了まで待つ。
「これらも必要だけどインストールする?」の一覧
binutils (2.20.51-2)
The GNU assembler, linker and binary utilities
Required by: gcc4-core
libcloog0 (0.15.7-1)
CLooG - the Chunky Loop Generator
Required by: gcc4-core
libffi4 (4.3.4-4)
Foreign Frame Interface shared runtime
Required by: gcc4-core
libgmpxx4 (4.3.1-3)
Runtime library for C++ interface to GMP library
Required by: libppl
libgomp1 (4.3.4-4)
GOMP shared runtime
Required by: gcc4-core
libmpc1 (0.8-1)
A library for multiple-precision complex floating-point arithmetic with exact rounding
Required by: gcc4-core
libmpfr1 (2.4.1-4)
A library for multiple-precision floating-point arithmetic with exact rounding
Required by: gcc4-core, libmpc1
libppl (0.10.2-1)
Run time libraries for the Parma Polyhedra Library
Required by: gcc4-core, libcloog0
libssp0 (4.3.4-4)
Static Stack Protection shared runtime
Required by: gcc4-core
w32api (3.17-2)
Win32 API header and library import files
Required by: gcc4-core
Cygwinを実行する。
Cygwinのプロンプト画面で下記を実行して PATHを設定する。
export PATH=$PATH:/cygdrive/d/android/android-ndk
これで準備完了。
●NDKでコンパイル
とりあえずサンプル プログラムのディレクトリに移動する。
cd /cygdrive/d/android/android-ndk/samples/hello-jni
下記コマンドでビルドする。
ndk-build
強制ビルド
ndk-build -B
詳細表示でビルド
ndk-build V=1
D:\Android\android-ndk\samples\hello-jni\libs\armeabi
に
libhello-jni.so
ができている。
いままでは下記手順でしたが、
build/host-setup.sh
make APP={AppName}
NDKの r4から
AndroidManifest.xml
の有る場所で
ndk-build
とコンパイル方法が変わりました。
●APKの作成
通常通り Eclipceや Antでコンパイルして APKを作成する。
コンパイルした物で本当にビルドされているかの確認で文字列の後ろに hogeを追加。
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI ! hoge");
}
・Hello_JNIのコンパイル&ビルド成功!

●配列を計算する処理を Nativeに置換えてみた。
Javaで処理: 800-1000ms程度
Native(C言語)で処理: 20ms程度
結果:40-50倍のパフォーマンス
●デバグ用のログ
#include <android/log.h>
__android_log_print(ANDROID_LOG_INFO, "LOG-TAG-NAME", "LOG-TEXT %d\n", 123);
●Windows版(cygwin) NDKでコンパイルするとサイズが 0の NULファイルができる
definitions.mk
の >NULを /dev/nullに変更する
host-rm = $(foreach _filepattern,$1,$(if $(strip $(wildcard $(_filepattern))),del /f/q/s $(subst /,\,$(_filepattern)) >/dev/null))
host-rmdir = del /f/s/e/q $(subst /,\,$1) >/dev/null 2>/dev/null
init.mk
の >NULを /dev/nullに変更する
UNAME := $(shell /bin/uname.exe -s 2>/dev/null)
※ NDK r7bでこの問題は修正されました。
●参考リンク
http://monoist.atmarkit.co.jp/fembedded/articles/android/02/android02a.html
http://www.atmarkit.co.jp/fjava/rensai4/android15/android15_1.html
ファイルやライブラリの情報を定義する「Android.mk」
http://www.atmarkit.co.jp/fsmart/articles/android15/android15_3.html
http://labs.techfirm.co.jp/android/iguchi/1782
https://docs.oracle.com/javase/jp/1.4/guide/jni/spec/design.doc.html
Tags: [Android開発]
●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)
Google Android開発環境の構築のつもり
Eclipse重い重い! Javaって相変わらずクソ重いね!
au IS01(SHARP)アンドロイド端末で開発
SHARPの Android端末 IS01で開発
au IS01(SHARP)アンドロイド端末で遊ぼう
SHARPの Android端末 IS01の便利な設定や使い方
[HOME]
|
[BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c)
2010 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator
http://www.neko.ne.jp/~freewing/android/android_ndk/