Download JAVA NATIVE INTERFACE (JNI)

Document related concepts
no text concepts found
Transcript
JAVA NATIVE INTERFACE (JNI)
INVOCANDO C/C++ DESDE JAVA
Java proporciona un marco denominado Java Native Interface (JNI), con la que es posible
escribir métodos nativos. Un método nativo es un método que se mapea a una función de
una librería de código nativo, tal como un DLL en Windows. Por ejemplo, se puede escribir
código en C o C ++ y llamarlo desde Java.
Ejemplo utilizando Ms Visual Estudio 2010
Las etapas para la implementar un proyecto en el que se invoque código C/C++ desde java
son:
1. Crear en Visual Estudio un proyecto en C / C ++ de tipo DLL .
2. Escribir las firmas de método Java para los métodos nativos
3. Compilar el archivo Java y ejecutar la herramienta javah para crear archivos de
encabezados en lenguaje C correspondientes a las firmas de los métodos del punto
anterior.
4. Asegurarse que el proyecto incluye los directorios que contienen los encabezados
JNI en sus includes
5. Basándose en los encabezados, escribir las implementaciones nativas de los
métodos (en C / C + +);
6. Compilar la DLL;
7. En el código de Java, llamar System.loadLibrary () para enlazar la librería en tiempo
de ejecución, y a continuación, invocar los métodos nativos.
1. Crear en Visual Estudio un programa en C / C ++ proyecto de tipo DLL
En la herramienta Visual estudio ejecutar el comando file->new project
Click OK y aparece la pantalla siguiente:
Clik Next
Seleccionar DLL y Click en Finish.
2. Crear directorio y escribir las firmas de método Java para los métodos nativos
Crear un directorio donde residirá el proyecto Java (en este ejemplo es
C:\Users\ProgAva\Desktop\DADI\square). A continuación, escriba la firma del método
que vamos a implementar de forma nativa. En general, esto se parece a una firma de
método ordinario de Java, pero con el modificador native. Contenido del archivo
Square.java
package math;
class Square {
public native int getSquare(int x);
static {
System.loadLibrary("Square");
}
public static void main(String[] args) {
int y=new Square().getSquare(4);
System.out.println(" Y = "+y);
}
}
Contenido del archivo Square.java
Contenido del directorio DADI/square
3. Compilar el archivo Java y ejecutar la herramienta javah para crear archivos de
encabezados en lenguaje C
Compilación y generación de encabezado
Nuevo contenido del directorio DADI/square
JNIEXPORT jint JNICALL Java_math_Square_getSquare(JNIEnv *, jobject, jint);
Firma de la función en C/C++ (tomada del archivo math_Square.h)
4. Asegurar que el proyecto incluye los directorios que contienen los encabezados JNI en
sus includes
En la pantalla de Visual Estudio hacer click con el botón derecho sobre el nombre del
proyecto y seleccionar la opción properties:
Aparecerá la siguiente ventana:
Agregar en Additional Include Directories los directorios del JDK que contienen archivos
de encabezados en lenguaje C que soportan programación en código nativo usando JNI
(modifique dependiendo de su directorio de instalación de JDK):
•
•
•
C:\Program Files\Java\jdk1.6.0_20\include
C:\Program Files\Java\jdk1.6.0_20\include\win32
Agregar también el directorio donde se encuentre math_Square.h a las librerías del
proyecto en el caso de este ejemplo es el directorio
C:\Users\ProgAva\Desktop\DADI\square
Asegurarse de que la librería a generar
corresponda a su plataforma Java. Por
ejemplo para x64: Click en el botón
Configuration Manager ubicado en la
esquina superior derecha de la ventana
de properties aparece:
Selección de la plataforma
5. Basándose en los encabezados, escribir las implementaciones nativas de los métodos
(en C / C + +)
Ahora, tenemos que escribir la función de C que será nuestra implementación del método
nativo. Para ello, en primer lugar, copie la firma de función en un programa en C / C + +
del archivo math_Square.h. Visual Studio habrá creado un archivo de código fuente
predeterminada a la que se puede agregar la función. En este proyecto llamado "Square",
Visual Studio agregó un archivo llamado Square.cpp. Así que se copia la línea anterior en
Square.cpp, añadiendo los nombres de las variables y un cuerpo de método. También se
incluye el archivo de encabezados math_Square.h , ya que este a su vez incluye los
encabezados JNI, que vamos a necesitar para acceder a funciones JNI y tipos de datos. El
resultado es el siguiente:
// Square.cpp : Defines the exported functions for the DLL application.
#include
#include
#include
#include
"stdafx.h"
<jni.h>
"math_Square.h"
<stdio.h>
JNIEXPORT jint JNICALL Java_math_Square_getSquare(JNIEnv * a, jobject b, jint x)
{
return x*x;
}
Implementación del método en C++
6. Compilar la DLL
7. En el código de Java, llamar System.loadLibrary () para enlazar la librería
Instalar la librería en donde la pueda localizar la JVM por ejemplo en la misma carpeta
donde está el archivo Java. (La librería puede ser localizada haciendo click derecho sobre
el nombre del proyecto y seleccionando Open Folder in Windows Explorer)
Ir al directorio Square\x64\Debug
Copiar el archivo Square.dll Y copiarlo en la carpeta donde está el .java
Contenido final del directorio DADI/square
Ejecución del programa Java