Las bibliotecas nativas son archivos de biblioteca específicos de la
plataforma, por ejemplo, objetos .dll, .so o *SRVPGM, que se
pueden configurar en las bibliotecas compartidas.
Las bibliotecas nativas son
visibles para un cargador de clases de aplicación siempre que se asocia la
biblioteca compartida con una aplicación. De la misma forma, las bibliotecas nativas
son visibles para un cargador de clases de servidor de aplicaciones siempre que se
asocia la biblioteca compartida con un servidor de aplicaciones.
Antes de empezar
Cuando diseñe una biblioteca compartida, tenga en cuenta las siguientes
condiciones sobre el soporte de biblioteca nativa Java:
- Java Virtual Machine (JVM) sólo permite un cargador de clases para cargar una
determinada biblioteca nativa.
- No existe ninguna interfaz de programación de aplicaciones (API) para descargar
una biblioteca nativa de un cargador de clases.
Las bibliotecas nativas las
descarga la JVM cuando el cargador de clases que ha encontrado la biblioteca se
recopila del almacenamiento dinámico durante la recogida de basura.
- Los cargadores de clases del servidor de aplicaciones, al contrario que el cargador de clases JVM nativo, sólo carga bibliotecas compartidas nativas que utilizan la ampliación predeterminada del sistema operativo para la plataforma actual. Por ejemplo, en AIX, las bibliotecas compartidas nativas deben terminar en .a cuando se cargan mediante cargadores de clases de servidores. El cargador de clases de JVM carga los archivos que terminan en .a o .so.
Java Web Start sólo puede cargar las bibliotecas compartidas nativas que tengan la extensión de archivo .so. Cambie el nombre de las bibliotecas compartidas nativas pertinentes, para que tengan la extensión de archivo .so, antes de empaquetarlas en un archivo JAR (Java archive) para el despliegue de Java Web Start.
- Los cargadores de clases de servidor de aplicaciones persisten el tiempo que
dura el servidor de aplicaciones.
- Los cargadores de clases de aplicación persisten hasta que la aplicación se
detiene o se recarga dinámicamente.
Si una biblioteca compartida que está
configurada con una vía de acceso de biblioteca nativa se asocia con una aplicación,
siempre que se reinicia o se recarga dinámicamente la aplicación, puede producirse
un UnsatisfiedLinkError en la aplicación indicando que la biblioteca ya está
cargada. El error se produce porque, cuando se reinicia la aplicación, invoca la
clase de biblioteca compartida para recargar la biblioteca nativa. No obstante, la
biblioteca nativa continúa cargada en la memoria, porque todavía no se ha recogido
la basura en el cargador de clases de aplicación que ha cargado previamente la
biblioteca nativa.
- Sólo el cargador de clases de JVM puede cargar una biblioteca nativa
dependiente.
Por ejemplo, si NativeLib1 depende de NativeLib2, NativeLib2
debe estar visible para el cargador de clases de JVM. La vía de acceso que contiene NativeLib2 debe especificarse en la vía de acceso de bibliotecas Java definida por la variable de entorno LIBPATH.
La propiedad LIBPATH (java.library.path) se configura
utilizando la variable de entorno
nombre_proceso_region_libpath como, por
ejemplo, control_region_libpath, server_region_libpath
o adjunct_region_libpath. Si desea obtener instrucciones
sobre cómo establecer las variables LIBPATH de la región, consulte
Cambio de los valores de variables referenciadas en los mensajes BBOM0001I
Si una biblioteca nativa configurada en una biblioteca compartida
depende de otras bibliotecas nativas, las bibliotecas dependientes se deben
configurar en la LIBPATH de la JVM que alberga el servidor de aplicaciones
para que esa biblioteca se cargue satisfactoriamente.
Acerca de esta tarea
Cuando se configura una biblioteca compartida en una
página de valores de
biblioteca compartida, si especifica un valor para
Vía de acceso de biblioteca nativa, la
aplicación
WebSphere Application Server o
los cargadores de clases de biblioteca compartida no localizan las
bibliotecas nativas de esta vía de acceso a menos que la clase que
carga la biblioteca nativa la haya cargado el mismo cargador de
clases.
Como un cargador de clases no puede cargar más de una vez una
biblioteca nativa, es preferible cargar las bibliotecas nativas dentro
de las bibliotecas compartidas asociadas con el cargador de clases de un servidor de
aplicaciones, ya que estos cargadores de clases persisten durante el ciclo de vida
del servidor.
Procedimiento
- Implemente un método estático en la clase que carga la biblioteca nativa.
En la clase que carga la biblioteca nativa, llame a
System.loadLibrary(biblioteca_nativa) en un bloque estático.
Por ejemplo:
static {System.loadLibrary("biblioteca_nativa");
La
biblioteca_nativa se carga durante la inicialización estática de la clase, lo
que ocurre exactamente una vez cuando se carga la clase.
- En la página de
valores de biblioteca compartida, establezca los valores de
Classpath y Vía de acceso de
biblioteca nativa que permiten que la biblioteca
compartida cargue la biblioteca nativa.
Si desea
asociar la biblioteca compartida con una aplicación o módulo,
seleccione también Utilizar un cargador de clases aislado
para esta biblioteca compartida. Si no habilita este
valor, asocie la biblioteca compartida con un servidor de
aplicaciones.
- Asocie la biblioteca compartida.
- Si no ha habilitado la opción Utilizar un cargador
de clases aislado para esta biblioteca compartida,
asocie la
biblioteca compartida con un servidor de aplicaciones.
La asociación de una biblioteca compartida con el cargador de clases de un
servidor de aplicaciones, en lugar de con una aplicación, garantiza que el cargador
de clases de servidor de aplicaciones cargue exactamente una vez la biblioteca
compartida, aunque las aplicaciones del servidor se reinicien o se recarguen
automáticamente. Como la biblioteca nativa se carga en un bloque estático, la
biblioteca nativa nunca se carga más de una vez.
- Si ha habilitado la opción Utilizar un cargador de
clases aislado para esta biblioteca compartida,
asocie la biblioteca
compartida con una aplicación o un módulo.
Al asociar un
archivo de biblioteca compartida aislada con una aplicación o un
módulo se cargan las clases representadas por la biblioteca
compartida en un cargador de clases distinto creado para dicha
biblioteca compartida. No asocie un archivo de biblioteca compartida aislada con un
servidor si desea tener un cargador de clases distinto para una
biblioteca compartida. Si asocia la biblioteca compartida con un
servidor, el producto omite el valor de aislamiento y añade archivos
de la biblioteca compartida al cargador de clases del servidor de
aplicaciones. Es decir, al asociar un archivo de biblioteca
compartida aislada con un servidor se asocia el archivo con todas las
aplicaciones del servidor.
El cargador de clases creado para
una biblioteca compartida aislada no se vuelve a cargar y, como
ocurre con un cargador de clases de servidor, existe durante el ciclo
de vida de un servidor. Para bibliotecas nativas compartidas, puede
utilizar una biblioteca compartida aislada para evitar los errores
resultantes de la recarga de bibliotecas compartidas.
Qué hacer a continuación
Para verificar si una aplicación puede utilizar una
biblioteca compartida, pruebe la aplicación o examine el cargador de
clases en el visor Cargador de clases.
Pulse . La classpath del cargador de clases del módulo de aplicación lista las clases utilizadas por la biblioteca compartida.