JNI: ¿Cómo puedo comprobar si jobject es un objeto null en código c nativo


JNI: ¿Cómo puedo comprobar si jobject es un objeto null en código c nativo

Author: RahulMohan82, 2010-02-27

3 answers

Dado que los objetos en código Java y C realmente usan las mismas ubicaciones de memoria (el objeto pasado al código nativo es la misma referencia de memoria en ambos mundos), un simple

if (someJObject == NULL) {}

En el código C debería estar bien, supongo. Sin embargo, no lo he probado: -)

 28
Author: David Sauter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-02 15:46:03

El comentario de Stewori merece ser una respuesta, así que aquí está:

(*env)->IsSameObject(env, someJObject, NULL) 

Creo que esta prueba tiene éxito cuando la comparación de valores falla cuando el tipo de referencia es JNIWeakGlobalRefType, frente a una referencia local o global.

 19
Author: nmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-02 21:21:12

La respuesta aceptada y las otras respuestas son todas correctas. Pero para ser más claro, siempre se puede comprobar

if (someJObject == NULL) {}

Para referencias locales y globales.

En cuanto a una referencia global débil, debe usar

(*env)->IsSameObject(env, someJObject, NULL)

Porque el objeto original en el lado Java ya podría ser basura recolectada mientras que el someJObject en el lado C todavía tiene el valor de referencia antiguo. Por lo tanto, es seguro decir que este último siempre funcionará para ambos casos.

Pero hay otra cosa que nota aquí. No debe llamar a ninguna función JNI basada en el valor de resultado de IsSameObject () , si se trata de una referencia global débil. Esto se debe a que el objeto puede ser recolectado en cualquier momento, incluso justo después de obtener TRUE de IsSameObject(). Puedes obtener lo que quiero decir de aquí y aquí.

Por lo tanto, personalmente creo que puede elegir lo que quiera a menos que esté tratando con algunos casos especiales con referencias globales débiles. Para casos simples, el primero es más fácil de leer e incluso más barato que llamar a una función JNI.

 0
Author: Jenix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-11 17:25:32