Si esto ayuda a alguien ... He usado esta función para un proyecto 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;
}
Una solución podría ser mejorada (Gracias por los comentarios):
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;
}
¿Está sugiriendo convertir el jstring a UTF-8 y luego de vuelta a UTF-16? ¿Es eso realmente necesario? – Rup
@Rup jstrings ya son UTF-8: "El JNI usa cadenas UTF-8 modificadas para representar varios tipos de cadenas. Las cadenas UTF-8 modificadas son las mismas que las utilizadas por la máquina virtual Java. Las cadenas UTF-8 modificadas están codificadas para que las secuencias de caracteres que contienen solo caracteres ASCII no nulos se pueden representar utilizando solo un byte por carácter, pero todos los caracteres Unicode se pueden representar ... La máquina virtual Java no reconoce el formato de cuatro bytes del UTF-8 estándar; utiliza su propio formato de dos veces tres bytes en su lugar ". –
@ b1naryatr0phy ¿De verdad? jni.h en mi sistema (ambos 1.6 y 1.7) tiene 'typedef unsigned short jchar;' que se parece más a UTF-16 para mí. – Rup