HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2010/08/13

Google Android JNI NDKの C/C++言語開発環境の構築のつもり 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のコンパイル&ビルド成功!
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開発環境の構築のつもり
Google Android開発環境の構築のつもり

  Eclipse重い重い! Javaって相変わらずクソ重いね!

au IS01(SHARP)アンドロイド端末で開発
au IS01(SHARP)アンドロイド端末で開発

  SHARPの Android端末 IS01で開発

au IS01(SHARP)アンドロイド端末で遊ぼう
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/