missing struct by value support in bridj

| No Comments | No TrackBacks

bridjのandroid対応は前回までで完了して、新バージョンのリリースも公開されたので、今度は別の方面で足りない部分をどうにかしようとしている。まず気づいたのが、tremoloのov_open_callbacks()が正しく呼び出せないということだ。どうやら、この引数にov_callbacks構造体がポインタなしで入っているのが引き金になっているようだ。現在のbridjはどうやらなまの構造体を引数や返り値に使用できないようだ(構造体へのポインタはOK)。limitationsに列挙されていた。

サポートされていないなら動かないのが想定通りの動作だ、と分かったので、そうなると実装する作業が必要になってくる。というわけで、今日はどの辺から着手すれば良いのかを探ることになった。それでソースを追っていて分かったのだけど、もしかしたら面倒なのかもしれない。

そもそも、ネイティブコードの呼び出しで使用されているdyncallには、構造体引数を処理するコードが存在していなかったようだ。structまわりをサポートするコードが、bridjの作者自身によってcontributeされていることが分かった(しかもほんの2ヶ月くらい前の話だ)。そしてそのコード自体、どうも不完全な状態で放置されている感じだ。そもそもdyncallに追加されたコードが、bridjから呼び出されていない。設計に問題があったのか、途中で放置しているのかもよく分からない。

structのparameter by valueとreturn by valueが面倒なのは、ひとつには構造体がJNIEnvで使用できる型になっていないということがある(Javaに無い; ポインタは単なる整数としてjlongで返せる)。JNAではサポートしているようだけど、これは多分JNIでは対応する値を含むMemoryを返すようにして、Javaコード側でフィールドにマッピングしているのだろうと思う(JNAのソースは読まないことにしているので、実際にはどうだか分からない)。構造体用にJavaオブジェクトを生成してメモリを読まなければならないとしたら不要なコストがかかっているのかもしれない。そもそも、C#なら値渡しはスタックで参照渡しはヒープと単純に割り切れるけど、ここではそうはならないかもしれない。

作者に聞いてみようと思うけど、もう少しソースを読み込んで分かってる面をしてから臨みたいと思っている。

No TrackBacks

TrackBack URL: http://veritas-vos-liberabit.com/noteon/mt-tb.cgi/162

Leave a comment