Utilizar el Java Native Interface (JNI)

Java es un sistema multi-thread, por lo tanto los mtodos nativos deben ser seguros con los threads, A menos que tengamos informacin extra (por ejemplo, si el mtodo nativo est sincronizado), debemos asumir que pueden existir varios threads de control ejecutndose sobre un mismo mtodo nativo en un momento dado. Por lo tanto, los mtodos nativos no deberan modificar variables globales sensibles de una forma desprotegida. Esto es, deben compartir y coordinar su acceso a variables de ciertas secciones crticas de cdigo.

Antes de leer esta seccin, deberas estar familiarizado con los conceptos de threads de control y programas multi-threads. Threads de Control cubre la programacin de threads. En particular, la pgina Programas Multi-Thread cubre elementos relacionados con la escritura de programas que contienen varios threads, incluyendo cmo sincronizarlos.

.Los Threads y el JNI

El puntero al interface JNI (JNIEnv *) slo es vlido en el thread actual. Se debe pasar el puntero al intercace de un thread a otro, o guardar el puntero al interface y utilizarlo en varios threads. La mquina virtual Java pasa el mismo puntero al interface en llamadas sucesivas a un mtodo nativo desde el mismo thread, pero diferentes threads pasan un diferente puntero al interface a los mtodos nativos.

No se deben pasar referencias locales de un thread a otro. En particular, una referencia local se podra volver no vlida antes de que otro thread tenga la posibilidad de utilizarla. Se deben convertir siempre en referencias globales cuando haya alguna duda sobre que una referencia a un objeto pueda ser uitlizada por threads diferentes.

Chequea el uso de variables globales cuidadosamente. Varios threads podran acceder a las variables globales al mismo tiempo. Asegurate de que pones los bloqueos nocesarios para asegurar la seguridad.

.Sincronizacin de Threads en Mtodos Nativos.

El JNI proporciona dos funciones de sincronizacin que permiten implementar bloques sincronizados. En Java, son implementados utilizando la sentencia synchronized. Por ejemplo.

synchronized (obj) {
   ...                   /* synchronized block */
}

La Mquina Virtual Java garantiza que un thread deba adquirir el monitor asociado con el objeto Java obj antes de poder ejecutar las sentencias del bloque. Por lo tanto, en un momento dado, slo puede haber un thread ejecutndose dentro del bloque sincronizado.

El cdigo nativo puede realizar una sincronizacin equivalente de objetos utilizando las funciones del JNI MonitorEnter y MonitorExit. Por ejemplo.

(*env)->MonitorEnter(obj);
...                      /* synchronized block */
(*env)->MonitorExit(obj);

Un thread debe introducir el monitor asociado con obj antes de poder continuar con la ejecucin. El monitor contiene un contador que seala cuantas veces ha sido introducido por un thread dado. MonitorEnter incrementa el contador cuando el thread entra un monitor que ya ha sido introducido. MonitorExit decrementa el contador. Si el contador alcanza el valor 0, otros threads pueden introducir el monitor.

.Wait y Notify

Otro mecanismo de sincronizacin de threads es Object.wait, Object.notify, y Object.notifyAll. El JNI no soporta directamente estas funciones. Sin embargo, un mtodo nativo puede seguir el mecanismo de llamada a mtodos para invocar a estos mtodos.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.