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

2009-09-01

drawBitmap で生ビットマップを表示

| 20:09

2Dデモを超高速に描画したいので基本的にはJNIでいきたいと思います。ががが、C/C++側で作成したビットマップを表示する方法がないと話にならない。

Canvas.drawBitmap に int[] を受け取るやつがあったのでそれでサンプルを作りました。(LunarLanderを換骨奪胎。)

f:id:keigoi:20090901200222p:image

緑色の小さな四角が斜めに動きます。 なんというしょうもないアプリ。

ソースをダウンロード

とりあえず、ここ にある一部のデモなんかが androidで動けばいいとおもっています。乞うご期待

LunarLander

12:33

とりあえずアニメーションのやり方が知りたかったので, サンプルのLunarLanderをコンパイルして起動してみた.

eclipse のプロジェクトはなかったけど空のプロジェクトを作ってファイルをぶちこんでリロードしたら勝手にコンパイルされた. eclipse様々.

f:id:keigoi:20090901123203p:image

キーボードの矢印キーがないと動かないようだ.仕方がないのでエミュレータで少し遊んだ.

Hello World

12:15

http://developer.android.com/guide/tutorials/hello-world.html を参考に、Hello World を動かしてみた。

エミュレーター

  • 実機が繋がっていない状態で, eclipse で Run As .. -> Android Application を選ぶと,エミュレータが起動する.
  • エミュレータの起動は実記と同様にOSの起動からはじまるので遅い!
    • 起動しっぱなしにする方法はないものか

実機

http://developer.android.com/guide/developing/device.html を参考にしたが,環境の構築までしか載ってなかった.

実機を接続した状態で eclipse から単に起動すればよかったようだ.

以下, http://www.adakoda.com/android/000218.html のとおり,

adb install アプリ名.apk

でインストールでき,起動できた. (.apk は プロジェクトルート/bin にeclipseが自動で生成するようだ)

ただアンインストールができない.

$ adb uninstall keigoi1.apk 
Failure

となる. TasKiller でアプリのタスクを殺してもだめ.なぜだ.

LanetaLaneta2012/02/15 05:16Going to put this atircle to good use now.

dlzqhuejcndlzqhuejcn2012/02/15 17:14SnmIDK <a href="http://ckjtafolcgmg.com/">ckjtafolcgmg</a>

tyamvfveqgctyamvfveqgc2012/02/16 23:38iTJ9xO , [url=http://wgoeqlwpbbvx.com/]wgoeqlwpbbvx[/url], [link=http://kmbstdvgpjzd.com/]kmbstdvgpjzd[/link], http://seadcakkinao.com/

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

2009-08-31

さあはじめよう / 4種類のコンポーネント

| 21:13

こっちと d:id:keigoi を分離するのはよろしくないなぁと思いつつも...

http://developer.android.com/guide/topics/fundamentals.html

  • aapt で .apk (Android PacKage) ファイルにまとめるよ
  • Androidの特徴は アプリの一部分を他から使えること。
    • アプリはmainのような単一のエントリポイントを持たない
    • アプリはコンポーネントを持っていてシステムは必要に応じてそれをインスタンス化する
  • アプリはそれぞれ固有のプロセスで動作するJVM上に載ってうごく
  • アプリは個別にユーザIDをもつ
    • ユーザIDを共有するアプリもある
    • ユーザIDを共有するアプリは同じプロセスで動作できる
  • コンポーネントには次の4種類がある.
    • Activities
    • Services
    • Broadcast Receivers
    • Content Providers
  • コンポーネントが必要になったとき,
    • アプリのプロセスがまだ動作していなければ,開始され
    • コンポーネントがインスタンス化されていなければ,インスタンス化される

Activities

  • "その時点でユーザが操作可能な" UIを実現する
  • Activity クラスのサブクラス
  • 単一のアクティビティしかもたないアプリもあれば、複数もつものもある
  • アプリが起動されたときに動作する Activity がある
  • あるアクティビティから別のに移るときは現在のアクティビティが次のやつを起動する
  • 画面の内容は Viewクラスのサブクラスで
  • ビューは階層構造をなし,ルートのビューをcontent viewとよぶ

Services

  • サービスはバックグラウンドでえんえんと走り続ける
  • Service基底クラスを拡張する
  • 例:音楽プレーヤー activity で曲を選択し,そのアクティビティが再生サービスを開始する
  • 動作中のサービスと相互作用もできる(動作してなかったら開始される). 再生,停止など
  • メインスレッドで走る.他のコンポーネントの邪魔をしないようにするには別のプロセスとかスレッドを立ち上げる

Broadcast Receivers

  • ブロードキャストアナウンスに反応するだけのコンポーネント.
    • システムによるブロードキャスト .. タイムゾーンの変更とかバッテリー残量低下とか写真が撮られたとか言語設定を変えたとか
    • アプリによるブロードキャスト .. 何かのダウンロードが完了して使えるようになったとか
  • いくつでも作れる BroadcastReceiver クラスを拡張してつくる
  • UIはもたないが Activity とか NotificationManager (ステータスバーのアレ) を使ってユーザにアラートをだせる

Content Providers

  • 他のアプリに露出するデータ
  • SQLite データベースに格納される
  • ContentProvider クラスを拡張してつくる
  • 利用側は ContentResolver から間接的にアクセス プロセス間通信なんかもやってくれる

AllanfadaoAllanfadao2012/06/06 10:11I can alraedy tell that's gonna be super helpful.

kpxunqeeuplkpxunqeeupl2012/06/06 16:55TKSsaB <a href="http://kzulljtuvxnx.com/">kzulljtuvxnx</a>

wytcvkwytcvk2012/06/07 12:14b9yE5M , [url=http://irsnzaixkrwq.com/]irsnzaixkrwq[/url], [link=http://kcqveioedlts.com/]kcqveioedlts[/link], http://scadyczpviwh.com/

fdqhjpydqcfdqhjpydqc2012/06/07 17:18OiGN8T <a href="http://bdkhqiadsneh.com/">bdkhqiadsneh</a>

TainaTaina2013/11/20 16:36At last! Someone who untrdseands! Thanks for posting!

BrandonBrandon2013/11/21 01:21Kudos to you! I hadn't <a href="http://sdupamef.com">thouhgt</a> of that!

JudithJudith2013/11/21 07:59Your post is a timely coittiburnon to the debate http://lknxpaug.com [url=http://piiadgfg.com]piiadgfg[/url] [link=http://uupniktvnz.com]uupniktvnz[/link]

UdienUdien2013/11/22 08:29Your <a href="http://cipozpo.com">hoensty</a> is like a beacon

RockyRocky2013/11/22 12:00I went to tons of links before this, what was I thiiknng? http://tjhdwfe.com [url=http://bfgvqc.com]bfgvqc[/url] [link=http://ljpcgcpdc.com]ljpcgcpdc[/link]

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