Utilizar el Java Native Interface (JNI)

Java es un sistema multi-thread, por lo tanto los m�todos nativos deben ser seguros con los threads, A menos que tengamos informaci�n extra (por ejemplo, si el m�todo nativo est� sincronizado), debemos asumir que pueden existir varios threads de control ejecut�ndose sobre un mismo m�todo nativo en un momento dado. Por lo tanto, los m�todos nativos no deber�an modificar variables globales sensibles de una forma desprotegida. Esto es, deben compartir y coordinar su acceso a variables de ciertas secciones cr�ticas de c�digo.

Antes de leer esta secci�n, deber�as estar familiarizado con los conceptos de threads de control y programas multi-threads. Threads de Control cubre la programaci�n de threads. En particular, la p�gina Programas Multi-Thread cubre elementos relacionados con la escritura de programas que contienen varios threads, incluyendo c�mo sincronizarlos.

.�Los Threads y el JNI

El puntero al interface JNI (JNIEnv *) s�lo es v�lido 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 m�quina virtual Java pasa el mismo puntero al interface en llamadas sucesivas a un m�todo nativo desde el mismo thread, pero diferentes threads pasan un diferente puntero al interface a los m�todos nativos.

No se deben pasar referencias locales de un thread a otro. En particular, una referencia local se podr�a volver no v�lida 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 podr�an acceder a las variables globales al mismo tiempo. Asegurate de que pones los bloqueos nocesarios para asegurar la seguridad.

.�Sincronizaci�n de Threads en M�todos Nativos.

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

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

La M�quina 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, s�lo puede haber un thread ejecut�ndose dentro del bloque sincronizado.

El c�digo nativo puede realizar una sincronizaci�n 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 ejecuci�n. El monitor contiene un contador que se�ala 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 sincronizaci�n de threads es Object.wait, Object.notify, y Object.notifyAll. El JNI no soporta directamente estas funciones. Sin embargo, un m�todo nativo puede seguir el mecanismo de llamada a m�todos para invocar a estos m�todos.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO