nazareno ejemplos descargar java c++ jni

descargar - jni java ejemplos



Cómo convierto jstring a wchar_t* (8)

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).

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 = ...


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 ...


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

Si desea minimizar su dependencia del código de terceros, 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. :-P Además, debe tener cuidado para rechazar formularios no más cortos , o puede abrir fallas de seguridad en algunos casos.


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


¿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; }


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); }


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 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; }