JNI経由でC++ DLLを使用するJavaアプリケーションがあります。いくつかのDLLのメソッドは文字列引数を取り、そのうちのいくつかは文字列も含むオブジェクトを返します。ダブルバイト(WCHAR)文字列をC++からJNI経由でJavaに渡す
現在DLLは、Unicodeをサポートしていないので、文字列の取り扱いがかなり容易である。
- Javaは(するString.getBytesを呼び出し)と単にcharとしてデータを扱うDLLに得られた配列を渡し*。
- DLLは、newStringUTF()を使用してconst char *からjstringを作成します。
TCHAR型(UNICODEがWindowsのWCHARデータ型を使用するように定義されている場合)を使用して、UnicodeをサポートするようにDLLを変更しています。 DLLの修正はうまくいっていますが、コードのJNI部分を変更する方法がわかりません。
私は今考えることができる唯一の事はこれです:
- JavaがするString.getBytes(文字列たcharsetName)を呼び出し、* wchar_t型としてデータを扱うDLLへの結果の配列を渡します。
- DLLは文字列を作成するのではなく、生の文字列データとともにjbyteArraysを渡します。 JavaはString(byte [] bytes、String charsetName)コンストラクタを使用して実際にStringを作成します。
このメソッドの唯一の問題は、使用する文字セット名がわからないことです。 WCHARは2バイトの長さなので、私はそれがUTF-16だと確信していますが、Java側には3つの可能性があります。 UTF-16、UTF-16BE、およびUTF-16LEがあります。私はバイトオーダーが何であるか教えてくれるドキュメンテーションを見つけられませんでしたが、いくつかの簡単なテストからそれを理解することができます。
良い方法がありますか?可能であれば、DLL内でjstringオブジェクトを構築していきたいと思います。そうすれば、それらのメソッドの使用法を変更する必要はありません。ただし、NewString JNIメソッドは文字セット識別子を取りません。
Hmは、最初にワイド文字列をutf-8文字列に変換することを検討していませんでした。私はCP_UTF8コードページの引数を必要とするだろうそのメソッドを使用すると仮定? – Herms
はい、CodePage引数はCP_UTF8でなければなりません。 –
サンプルコードをありがとう。私はそれらの議論のいくつかについて完全には確信していませんでした。そして、私が正しいと推測していることを確認するのはうれしいです。 :) – Herms