JNIを介してC++DLLを使用するJavaアプリケーションがあります。DLLのメソッドのいくつかは文字列引数を取り、それらのいくつかは文字列を含むオブジェクトも返します。
現在、DLLはUnicodeをサポートしていないため、文字列の処理はかなり簡単です。
- JavaはString.getBytes()を呼び出し、結果の配列をDLLに渡します。DLLはデータをchar*として処理します。
- DLLはNewStringUTF()を使用して、constchar*からjstringを作成します。
現在、UnicodeをサポートするようにDLLを変更し、TCHAR型(UNICODEが定義されている場合はWindowsのWCHARデータ型を使用)の使用に切り替えています。DLLの変更は順調に進んでいますが、コードのJNI部分を変更する方法がわかりません。
私が今考えることができる唯一のことはこれです:
- JavaはString.getBytes(String charsetName)を呼び出し、結果の配列をDLLに渡します。DLLはデータをwchar_t*として扱います。
- DLLは文字列を作成しなくなりましたが、代わりに生の文字列データとともにjbyteArraysを渡します。Javaは、String(byte [] bytes、String charsetName)コンストラクターを使用して、実際にStringを作成します。
このメソッドの唯一の問題は、使用する文字セット名がわからないことです。WCHARは2バイトの長さなので、UTF-16であると確信していますが、Java側には3つの可能性があります。UTF-16、UTF-16BE、およびUTF-16LE。バイトオーダーが何であるかを教えてくれるドキュメントは見つかりませんでしたが、いくつかの簡単なテストからおそらく理解できます。
もっと良い方法はありますか?可能であれば、DLL内でjstringオブジェクトを作成し続けたいと思います。そうすれば、これらのメソッドの使用法を変更する必要がなくなります。ただし、NewStringJNIメソッドは文字セット識別子を取りません。