今日ようやく腰を落ち着けて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の使い方などを簡単にまとめて公開する必要があるだろう。これは別途少しずつ文章をまとめている。
Leave a comment