Nếu điều này giúp ai đó ... Tôi đã sử dụng chức năng này cho một dự án Android:
std::wstring Java_To_WStr(JNIEnv *env, jstring string)
{
std::wstring value;
const jchar *raw = env->GetStringChars(string, 0);
jsize len = env->GetStringLength(string);
const jchar *temp = raw;
while (len > 0)
{
value += *(temp++);
len--;
}
env->ReleaseStringChars(string, raw);
return value;
}
Một giải pháp cải tiến có thể là (Cám ơn phản hồi):
std::wstring Java_To_WStr(JNIEnv *env, jstring string)
{
std::wstring value;
const jchar *raw = env->GetStringChars(string, 0);
jsize len = env->GetStringLength(string);
value.assign(raw, raw + len);
env->ReleaseStringChars(string, raw);
return value;
}
Bạn đang đề xuất chuyển đổi chuỗi ký tự thành UTF-8 rồi quay lại UTF-16? Điều đó có thực sự cần thiết không? – Rup
@Rup jstrings đã là UTF-8: "JNI sử dụng các chuỗi UTF-8 được sửa đổi để biểu diễn các loại chuỗi khác nhau. Chuỗi UTF-8 được sửa đổi giống với các chuỗi được sử dụng bởi máy ảo Java. Các chuỗi UTF-8 được sửa đổi được mã hóa sao cho các chuỗi ký tự chỉ chứa các ký tự ASCII không null có thể được biểu diễn chỉ bằng một byte cho mỗi ký tự, nhưng tất cả các ký tự Unicode có thể được biểu diễn ..... Máy ảo Java không nhận dạng được định dạng bốn byte chuẩn UTF-8; sử dụng định dạng hai lần ba byte của chính nó thay thế. " –
@ b1naryatr0phy Thật sao? jni.h trên hệ thống của tôi (cả 1.6 và 1.7) có 'typedef unsigned short jchar;' trông giống như UTF-16 đối với tôi. – Rup