JNIでSJISの文字列を扱う関数を作ってみた。
実質は「new String(バイト配列, "MS932")」とか「str.getBytes("MS932")」をやっているだけだけど。
C/C++側でこれをやって、charの配列にして返すことに意味がある。
Java側でこれをやってSJISのバイト配列を渡すようにしても、C/C++側でけっきょくバイト配列からcharの配列を取得する必要があるから。それなら全部C/C++側でやっちゃいたいよねー。
ところで この関数では、関数内でしか使わないワークとしてStringやbyte[]のオブジェクトを作り出しているが、少なくともJavaへ制御が戻らないとGCでクリアされないよなー。(そもそもJNI関数の中でGCが動くことがあるのかどうか不明だが)
つまり何度も呼び出していると無駄なオブジェクトがどんどん溜まっていくわけだ。
使わなくなったことを示すJNI関数とかがあればいいんだけどなー。
あと、char配列はmallocを使ってfreeで解放するというベタな方法を採っているが、C/C++なので、解放し忘れって当然考えられるわな。JNIのRelease系関数って、やっぱり同じなのかなぁ。もしJavaに戻る際に自動的に解放するような機構をとっているなら、それと同じやり方にしたいよなー。