Professional Documents
Culture Documents
Unidad II - Librerias Dinámicas
Unidad II - Librerias Dinámicas
Ing. en Sistemas
Computacionales
Tópicos Avanzados de Programación
Pero este enfoque no es eficiente, pues cada programa contiene código idéntico para
las rutinas comunes. Además, si cambia una de las rutinas en la librería, tendrá que
volver a enlazar todos los programas que hacen uso de la rutina modificada.
Sin embargo, si pone estas rutinas comunes en una librería de enlace dinámico
llamada, por ejemplo, CONTAB.DLL, habrá resuelto ambos problemas. Sólo el
módulo de librería necesita contener las rutinas requeridas por todos los programas
(requiriendo por tanto menos espacio de disco para los archivos y menos espacio de
memoria cuando se ejecutan dos o más aplicaciones simultáneas) y puede hacer
cambios al módulo de librería sin necesidad de volver a enlazar los programas
Librerías dinámicas
Las librerías de enlace dinámico pueden ser ellas mismas
productos definitivos.
Por ejemplo, en Microsoft Visual C++, la librería objeto normal que usted
enlaza con su programa se llama LIBC.LIB.
Librería: una palabra, varios
significados
Una librería de importación es una forma especial de archivo de librería
objeto. Igual que las librerías objeto, las librerías de importación tienen la
extensión .LIB y se utilizan por el enlazador para resolver llamadas a
funciones en su código fuente.
static
{
System.loadLibrary("hello");
}
}
Definir un método nativo
Todos los métodos, tanto métodos Java, como métodos nativos, se deben definir dentro de una
clase Java. Cuando se escribe la implementación de un método en un lenguaje de programación
distinto de Java, se debe incluir la palabra clave native como parte de la definición del método
dentro de la clase java.
La clave native indica al compilador Java que la función es una función en lenguaje nativo. Es
sencillo decir que la implementación del método displayHelloWorld() de la clase HelloWorld
está escrita en otro lenguaje de programación porque la clave native aparece como parte de su
definición de método.
Esta definición de método en nuestra clase Java sólo proporciona la firma del método para
displayHelloWorld(). No proporciona la implementación para el método. Se deberá
proporcionar la implementación para displayHelloWorld() en un archivo fuente separado en el
lenguaje nativo.
Se utiliza el método System.loadLibrary para cargar la librería compartida que se creo cuando
compilamos la implementación del código. Este método se coloca con un inicializador static. El
argumento de System.loadLibrary es el nombre de la librería. El sistema utiliza un estándard,
pero específico de la plataforma, para convertir el nombre de la librería a un nombre de librería
nativo. Por ejemplo, en Solaris convierte el nombre "hello" a libhello.so, mientras que en Win32
convierte el mismo nombre de librería a hello.dll.
El siguiente inicializador static de la clase HelloWorld carga la librería apropiada, llamada hello.
El sistema de ejecución ejecuta un inicializador estático cuando carga la clase.
static
{
System.loadLibrary("hello");
}
Crear el programa principal
También se debe crear un archivo fuente separado con una aplicación Java que instancia la clase
que contiene la definición de método nativo.
Esta aplicación Java también llamará al método nativo. Como es una aplicación, debe tener un
método main. En un archivo fuente separado, que para este ejemplo hemos llamado Main.java, se
crea una aplicación Java que instancia HelloWorld y llama al método nativo
displayHelloWorld().
Como se puede ver a partir del código anterior, se llama a un método nativo de la misma forma en
que se llamaría a un método normal: sólo añadir el nombre del método al final del nombre del
objeto, separado con un punto ('.'). Una pareja de paréntesis, ( ), sigue al nombre del método y
encierra los argumentos. El método displayHelloWorld() no tiene ningún argumento.
Paso 2. Compilar el código Java
Ejecutamos javah ahora sobre la clase HelloWorld que se creó en los pasos
anteriores.
El JNI requiere que cualquier método nativo tenga estos dos parámetros. El
primer parámetro es un puntero a una interfaz JNIEnv. A través de este
puntero, el código nativo podrá acceder a los parámetros y objetos de la
aplicación Java.
La función que escribamos debe tener la misma firma de función que la que se generó con javah dentro del
fichero HelloWorld.h en el paso 3. Recordemos que la firma de la función generada para el método nativo
displayHelloWorld() de la clase HelloWolrd, se parece a esto.
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
Hello World!