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