2011/09/09

Parcelableは不思議だ

PaSoRiを使って、FeliCa LiteにNDEFのデータを書こうと思った。
データの見方はわかったのだけど、実装するのはめんどくさい。
きっと、Android提供部分にあるはずだ、と探すと、あった。
android.nfc.NdefRecordだ。

 

これが、Parcelableをimplementsしている。
android.os.Parcelableだ。
よく見るんだけど、使ったことがない・・・。
これを機会に、ちょっと見てみようと思ったのが発端だ。

 

どうでもいいことだが、NdefRecordのパケット解析部分はJNIを呼んでいて、そこからlibnfcを呼んでいた。
まあ、そんなもんだ。


Parcelableで検索すると、いっぱい出てくるので、ここに書くことはなかろう。

ソースを見ると、Parcelable自体はシンプルだ。
特に中身があるわけでもない。

 

作業をしているのは、Parcelの方みたいなので、ちょっと見てみよう。
データを書き込むとき、例えばint型であれば、writeInt()というメソッドを呼び出すようだ。
では、writeInt()のソースは・・・JNIか。
JNIのソースファイルは、android_util_Binder.cpp。
そう、Binder関係なのだ。

Binderは、Android用にkernelに手を加えてまで追加したプロセス間も通信できる機能。
らしい。

 

writeInt(jint)は、binderのParcel::writeInt32(int32_t)を呼び出すくらいのことしかしていない。
binderのParcelは、frameworks/base/binderにある。
ここでもwriteAligned(int32_t)しか呼んでない。
writeAligned()は、テンプレートだ。
sizeof(T)が容量内にあることを確認できたら、reinterpret_cast<T*>した左辺値に代入して、sizeof(T)を返している。

いやあ、びっくりだ。
キャストが左辺に置けるんだ。
これって、gcc拡張かなにかか?
あるいは新しいC++ではそんなことが許可されているのか?
最近どっかでそういう記事を見たような気がする。

とまあ、ここまでで見るのはやめだ。
メモリ効率よりも速度効率を優先してるって感じなのがわかったので、よしとしよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。