tremolo binding on bridj

| No Comments | No TrackBacks

今日ようやく腰を落ち着けてdirentのSEGV問題とtremoloのSEGV問題に取り組んで、両方とも解決することが出来た。

direntの方は非常に単純な話で、access()関数のフラグ引数の使い方を間違えていた...ディレクトリの内容を参照しようと思ったら、X_OKだけでなくR_OKも必要だった。これは、JNI抜きでCの同等コードを書いて動かしてみて判明した。

tremoloの方はもう少しややこしかった。とりあえずAndroidでデバッグしようと思うと大変なので、tremoloバインディングをテストするLinuxスタンドアロン版のコンソールツールを作成して、それをgdbでデバッグするという方法で確認した。gdbではオブジェクトが渡されるべきところにNULLが渡っていたので、gdb側ではよく分からないと思ってeclipseでandroid版を動かしているうちに気がついた。

次の問題はややこしくて、JNAeratorで生成された構造体に対応するクラスで(もう覚えていない)例外が投げられるというので、調べてみたらそのクラスのフィールド定義が不足していて(型定義を解析できないとそうなるらしい)、結果的にCの構造体とサイズが合わないというものだった。JNAeratorに食わせるCヘッダに、不足かつ必要な部分を補強して生成したコードを渡したら上手く使えるようになった。

というわけで、java版でも無事JNIを使用しないコードを書いてoggファイルを再生することが出来た。実のところそれだけが目的ならJNIを使えば瞬殺で書けたわけだけど。

あとbridjを広めるためには、bridjとJNAeratorの使い方などを簡単にまとめて公開する必要があるだろう。これは別途少しずつ文章をまとめている。

No TrackBacks

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

Leave a comment