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