Hatena::Groupandroid

keigoiの日記

 | 

2009-09-02

プラズマデモ

18:15

(追記:このデモは サイケデリック デモとして公開しました。)

作ったゼ!!!!

f:id:keigoi:20090902181341p:image

動画

ソース & apk

http://sites.google.com/site/koyamakannon/Home/android-plasma.zip

元ネタ

http://www.agusa.i.is.nagoya-u.ac.jp/person/sydney/rainbow/

JNI側関数 : GetPrimitiveArrayCritical / ReleasePrimitiveArrayCritical

12:32

描画のために C側でintの配列を操作するわけだけど,一番オーバーヘッドが少なさそうなのがこの関数だ.

こんな感じで使った:

JNIEXPORT void JNICALL Java_jp_keigoi_androidanime_MyView_drawsquare
(JNIEnv * env, jobject self, jintArray arr, jint x, jint y, jint w, jint h, jint bw, jint bh, jint color) {
	
	jint * const a = (jint*)(*env)->GetPrimitiveArrayCritical(env, arr, 0);
	jint *p = a;
	for(; p < a + y * bw; p++) {
		*p = 0;
	}
	for(int i = 0; i < h; i++) {
		for(int j = 0; j < x; j++) {
			*p = 0;
			p++;
		}
		for(int j = x; j < x+w; j++) {
			*p = color;
			p++;
		}
		for(int j = x+w; j < bw; j++) {
			*p = 0;
			p++;
		}
	}
	for(; p < a + bw*bh; p++) {
		*p = 0;
	}	
	(*env)->ReleasePrimitiveArrayCritical(env, arr, a, 0);
}

JNIで高速化

12:30

昨日のしょうもないアプリの画面描画をJNIで書き直してみた。 ちゃんとパフォーマンス計測していないので何を言ってもアレだけど体感で5倍以上にはなってる気がする(FPSとか表示するのは今後の課題)。そりゃー JITも何もないVMと比べたら当然だよなぁと思いつつ、一気に Androidメガデモ計画が現実的になってきたことはやや嬉しい。

  • GCの度にちょっと遅くなるので、 メモリの動的確保はできるだけ無くさないといけないと思う

ソース & apk

こちら

NDKのインストール手順

  • Android NDK (Native Development Tools) をダウンロード,好きな場所に展開
    • 展開したツリーの中に 開発するアプリを配置するので, 場所は/usr/local ではなく ホーム以下のどっかが良いと思う
  • インストール
    • export ANDROID_NDK_ROOT=<NDKを配置したディレクトリ>
    • $ANDROID_NDK_ROOT/build/host-setup.sh
  • 正しくビルドできることを確認
    • cd $ANDROID_NDK_ROOT
    • make APP:=hello-jni
    • apps/hello-jni/project/libs/armeabi/libhello-jni.so ができていることを確認
  • 動かしてみる
    • apps/hello-jni/project をプロジェクトルートとして eclipse に追加
    • hello-jni を起動してみる

JNI を使ってみる

準備

  • app/アプリ名/project に新しい Android プロジェクトを配置
  • sources/アプリ名 に、ネイティブ側のメイクファイルを準備
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS    := -std=c99
LOCAL_MODULE    := androidanime
LOCAL_SRC_FILES := animetest-jni.c

include $(BUILD_SHARED_LIBRARY)
    • LOCAL_MODULE は 生成する lib***.so の名前を書く
    • LOCAL_SRC_FILES は .so を構成するモジュールを並べる
    • C99 が使いたければ上のように書く

native なメソッドの宣言とnativeなモジュールのロード

  • 次のような native 修飾子 をつけた メソッドをつくる
public native void drawsquare(int[] bitmap, int x, int y, int w, int h, int bw, int bh, int color);
  • 上で LOCAL_MODULE で付けた名前のモジュールを クラスのstatic初期化子でロード
	static {
		System.loadLibrary("androidanime");
	}

Javaソースのコンパイル

(eclipseが勝手に bin/ 以下に .class ファイルを作ってくれる)

ネイティブ側ヘッダファイルの作成

cd bin
javah -classpath . (native宣言したクラスのQN, たとえば jp.keigoi.androidanime.MyView)
  • jp_androidanime_MyView.h というヘッダファイルができる. これを sources/アプリ名 に置く

ネイティブ側ソースファイルの作成 (JNI側関数)

  • ヘッダファイルに書かれたシグネチャを持つ関数を書く.

JNI側 Cソースのコンパイル

  • cd $ANDROID_NDK_ROOT
  • make APP:= アプリの名前
    • オプション -B で確実にリビルドされます
$ make APP=androidanime -B
Android NDK: Building for application 'androidanime'    
Compile thumb  : androidanime <= sources/keigoi/androidanime/animetest-jni.c
SharedLibrary  : libandroidanime.so
Install        : libandroidanime.so => apps/androidanime/project/libs/armeabi

実行

実行.

MartyMarty2012/02/15 02:06My hat is off to your astute comnmad over this topic-bravo!

znxlgvfyykznxlgvfyyk2012/02/15 22:08vVrbZm , [url=http://temroksyiipy.com/]temroksyiipy[/url], [link=http://ucydznjsetmj.com/]ucydznjsetmj[/link], http://cnaiovexhhwq.com/

owvsgkgmeowvsgkgme2012/02/17 21:339oMws1 <a href="http://nwzmbrndgcin.com/">nwzmbrndgcin</a>

SandySandy2013/11/20 14:05Wow, this is in every repsect what I needed to know.

AliAli2013/11/21 01:05Your articles are for when it <a href="http://lpdwbvkeyy.com">abutlsoely,</a> positively, needs to be understood overnight.

MiguelMiguel2013/11/21 07:42The exirstpee shines through. Thanks for taking the time to answer. http://ntuuggkmxr.com [url=http://kmnxkvhne.com]kmnxkvhne[/url] [link=http://mfpltbxmq.com]mfpltbxmq[/link]

BalaBala2013/11/22 08:12Superior thinking <a href="http://oiodyfhfcb.com">detetsnramod</a> above. Thanks!

HanEolHanEol2013/11/22 11:43That's a knowing answer to a diffucilt question http://pxeiisebr.com [url=http://zokksk.com]zokksk[/url] [link=http://abgvveabt.com]abgvveabt[/link]

トラックバック - http://android.g.hatena.ne.jp/keigoi/20090902
 |