数か月前、私は JNI を使用して C API をラップする Java API を作成しました。C API は char 文字列を使用し、GetStringUTFChars を使用して Java 文字列から C 文字列を作成しました。
非 ASCII 文字で発生する可能性のある問題について考えるのを怠っていました。
それ以来、C API の作成者は、wchar_t 文字列を要求または返す C 関数のそれぞれに相当するワイド文字を作成しました。Java API を更新してこれらのワイド文字関数を使用し、非 ASCII 文字に関する問題を解決したいと考えています。
JNI のドキュメントを調べた結果、GetStringChars メソッドまたは GetStringRegion メソッドを使用することの相対的な利点に少し戸惑いました。
wchar_t 文字のサイズが Windows と Linux で異なることは認識しており、C 文字列を作成する (そして後で Java 文字列に変換する) 最も効率的な方法がわかりません。
これは私が現時点で持っているコードで、1文字あたり2バイトの文字列を作成すると思います:
int len;
jchar *Src;
len = (*env)->GetStringLength(env, jSrc);
printf("Length of jSrc is %d\n", len);
Src = (jchar *)malloc((len + 1)*sizeof(jchar));
(*env)->GetStringRegion(env, jSrc, 0, len, Src);
Src[len] = '\0';
ただし、wchar_t のサイズが jchar と異なる場合は、これを変更する必要があります。