2011-05-02 6 views
65

El libro "JNI esencial: Java Native Interface" por Rob Gordon contiene el siguiente ejemplo de código para convertir un jstring a una cadena C:¿Debería llamar a ReleaseStringUTFChars si GetStringUTFChars devolvió una copia?

const char* utf_string; 
jboolean isCopy; 
utf_string = env->GetStringUTFChars(str, &isCopy); 
/* ... use string ... */ 
if (isCopy == JNI_TRUE) { 
    env->ReleaseStringUTFChars(str, utf_string); 
} 

Tenga en cuenta que sólo se llama ReleaseStringUTFChars si isCopy es cierto.

Pero el libro (enlace alternativo: http://192.9.162.55/docs/books/jni/html/objtypes.html#5161) Java Native Interface: Programmer's Guide and Specification dice:

La llamada ReleaseString-char es necesaria si GetStringChars tiene conjunto * isCopy a JNI_TRUE o JNI_FALSE. ReleaseStringChars libera la copia o anula la instancia, según según si GetStringChars ha ha devuelto una copia o no.

Estoy en lo correcto al asumir que esto es un error en el libro de Gordon?

+1

¿dónde se define 'str'? – SomethingSomething

Respuesta

55

Sí, su suposición es correcta (siempre debe llamar a ReleaseStringUTFChars).

+0

¿Qué sucede si no se llamará? – Tama

+0

Se habrá filtrado la memoria (la JVM creerá que necesita la memoria indefinidamente). –

+0

¡Claro! Pero por qué no tenemos la función de memoria asignada libre para otros tipos de datos como: int, double. Debería ser RealseInt (arg, arg), ReleaseDouble (arg, arg) ... o algo así? – Tama

Cuestiones relacionadas