Cómo convierto jstring a wchar_t *

Digamos que en el lado C ++ mi función toma una variable de tipo jstring llamada myString . Puedo convertirlo en una cadena ANSI de la siguiente manera:

 const char* ansiString = env->GetStringUTFChars(myString, 0); 

hay una manera de conseguir

const wchar_t* unicodeString =

Si esto ayuda a alguien … he usado esta función para un proyecto de 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 mejorada podría ser (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; } 

¿Y quién libera a wsz? ¡Recomendaría STL!

 std::wstring JavaToWSZ(JNIEnv* env, jstring string) { std::wstring value; if (string == NULL) { return value; // empty string } const jchar* raw = env->GetStringChars(string, NULL); if (raw != NULL) { jsize len = env->GetStringLength(string); value.assign(raw, len); env->ReleaseStringChars(string, raw); } return value; } 

Una solución portátil y robusta es usar iconv , en el entendimiento de que debe saber qué encoding usa su sistema (UTF-16 en Windows, UTF-32 en muchos sistemas Unix, por ejemplo).

Si desea minimizar su dependencia del código de un tercero, también puede pasar su propio convertidor UTF-8 a mano. Esto es fácil si se convierte a UTF-32, algo más difícil con UTF-16 porque también tiene que manejar pares sustitutos. 😛 Además, debe tener cuidado para rechazar formularios no más cortos , o puede abrir fallas de seguridad en algunos casos.

JNI también tiene una función GetStringChars (). El tipo de retorno es const jchar *, jchar es de 16 bits en win32, de modo que sea compatible con wchar_t. No estoy seguro si es UTF-16 real o algo más …

Sé que esto fue pedido hace un año, pero no me gustan las otras respuestas, así que voy a responder de todos modos. Así es como lo hacemos en nuestra fuente:

 wchar_t * JavaToWSZ(JNIEnv* env, jstring string) { if (string == NULL) return NULL; int len = env->GetStringLength(string); const jchar* raw = env->GetStringChars(string, NULL); if (raw == NULL) return NULL; wchar_t* wsz = new wchar_t[len+1]; memcpy(wsz, raw, len*2); wsz[len] = 0; env->ReleaseStringChars(string, raw); return wsz; } 

EDITAR : Esta solución funciona bien en plataformas donde wchar_t tiene 2 bytes, algunas plataformas tienen 4 bytes wchar_t en cuyo caso esta solución no funcionará.

Si no estamos interesados ​​en la capacidad de plataforma cruzada, en Windows puede usar la función MultiByteToWideChar o las útiles macros A2W ( ejemplo de referencia).

Solo use env-> GetStringChars (myString, 0); Java pase Unicode por su naturaleza

Bastante simple. Pero no te olvides de liberar la memoria por ReleaseStringChars

 JNIEXPORT jboolean JNICALL Java_TestClass_test(JNIEnv * env, jobject, jstring string) { const wchar_t * utf16 = (wchar_t *)env->GetStringChars(string, NULL); ... env->ReleaseStringChars(string, utf16); }