JAVA, DLL y C
Un saludo a todos en la comunidad, ya pude hacer mi programita que tantas canas me saco.... pero en fin
Les recuerdo: Hacer dos programas y se comuniquen por medio de librerías dinamias o DLL. El ejercicio trata de instanciar un arreglo de enteros con un dimensión de 5000 y en cada espacio agregar un numero radom de 0 a 60000 y en su salida imprimir estos numeros en orden ascendente. La cuestion es que el arreglo se debe instanciar en C o C++ (use C), el arreglo lo recibe un programa en java y este los ordena y después el programa en java envia el arreglo en orden a C y este los imprime. (Facil no??? ='()
Bueno, para empezar con la solución al problema empeze leyendo todo lo referente al JNI pero igual no me daban tantas ideas que digamos... pero en si lo esencial del estudio es que JAVA manejo un su JDK una carpeta ubicada en %JAVAROOT%/BIN un programa llamado javah.exe. Este programa apartir de un .class crear un .h para manejarlo desde C.
Estos son los pasos para la solución al problema. jejee pero solo voy hacer el hola mundo y de hay en adelante es googlear y leer este manual y podran sacar el ejercicio anterior:
- 1. Intalar el JDK y un compilador de C o C++. Utilice el Visual C++ de .NET y su compilador es CL.exe y el de java es JAVAC.exe JAVA SE JDK y para el Visual C++ pueden trabajar la version 6.0, sino quieren trabajar un .NET .... Les recomiendo este torrent
- 2. Un Pequeña definición !!!
Bueno antes empezar con la configurarion voy hacer un definicion de ¿QUE ES JNI?
Java Native Interface (JNI) es la mecánica propuesta por Java para invocar funciones implementadas en lenguaje C desde programas Java.
3. Configuración de las variables de Entorno:
Debemos asegurarnos de tener bien configurado el entorno de compilación de C y de JAVA, debido a que lo voy a explicar todo lo hice bajo consola.
Variable JAVAHOME y VCHOME:
- Incio
>MiPc (click Derecho)
> Propiedades
>Opciones Avanzadas
> Variables de Entorno (Click)
Nos debe generar un ventanita de este tipo:
Cuando click podemos ver la diferentes variables que maneja sistema:
Fijemonos en variables del sistema (en el ciculo rojo) y en la variable PATH. Si se dan cuenta tiene uno parámetro importarte y es el C:\Windows\System32 y es desde allí que nosotros tenemos acceso a cualquier programa que contiene este carpeta. Como el TELNET, PING, MsPaint... entre otros y se considera una variable importante dentro del entorno Windows.
Nos paramos encima de PATH y le demos EDITAR vamos hasta el final de la linea (SIN BORRAR NADA) y agregan la dirección en donde se encuentra el Bin del JDK y del Visual C++
Por Ejemplo: En mi máquina el JDK se encuentra en C:\Archivos de Programa\Java\JDK1.6.0_13\Bin y en vidual Studio 2008 esta en C:\Archivos de Programa\Microsoft Visual Studio 8\VC\bin
Copiamos y pegamos cada una de las direcciones en los parámetros del PATH, separados por PUNTO Y COMA (IMPORTANTE !!!! ) y luego ACEPTAR
Para consultar si quedo bien nuestra configuración debemos ir a la consola (Win+R> CMD) y escribimos javac y si salen los parámetros de java es por que esta bien configurado
También lo hacemos para el Visual C++ con el Comando cl y si nos salen los parametros del Visual C++ estara bien configurado y Listo para Trabajar- 4. Aseguradonos de que el entorno esta bien configurado debemos crear dos variables mas que son el INCLUDE (donde almacenamos las librerías a usar como el JNI.h) y el LIB para las Librerías del Visual C++
Para la variable INCLUDE que no esta definida, demos crearla y pasarle cada uno de los parámetros. En las misma Ventana de las variables de entrono y ubicándonos en Variables del Sistema damos Click en NUEVA nos sale un ventanita y le ingresamos con el nombre de INCLUDE y en los parametros o valor de la variable agregamos las direcciones donde se alojan los INCLUDES de cada Compilador.
Para JAVA se encuentra (en mi maquina) en : C:\Archivos de Programa\Java\jdk1.6.0_13\include (podemos ver el jni.h) y segudi de un PUNTO y COMO también agregamos C:\Archivos de Programa\Java\jdk1.6.0_13\include\Win32
Para el VISUAL C++ (en mi maquina y utilizando Visual Studio .NET) en : C:\Archivos de Programa\Microsoft Visual Studio 8\VC\include
NOTA: Les recuerdo cada parametro va separado de un PUNTO Y COMO ";"
Seguimos con la variable LIB, aqui especificamos en donde se encutran las librerias de Visual C++
Esta variable no esta definida y como la anterior hay que crearla, se crea con el nombre de LIB y como único parámetro le pasamos esta direccion (en mi maquina) C:\Archivos de Programa\Microsoft Visual Studio 8\VC\lib
Para verificar si quedo bien configurada entramos a consola y escribimos el comando LIB, pero si escribimos INCLUDE no nos aparece nada, pero sabemos que la variable existe.- 5. Ahora Si a Programar !!!!
Listo después de este preliminar (que no se si es ecencial, no quiero ser tan básico en mis POST) empezaremos en primera instancia creando nuestro programa en java.
Antes de todo, creemos una carpeta en C:\ o en donde quieran y guarden cada uno de los archivos generados en el proceso en esta carpeta!!!
Este es el CODE y con sus anotaciones:
Código
public class HolaMundoJNI{ public native void muestraHolaMundo(); //invocamos el Metodo NATIVO HolaMundoJNI test = new HolaMundoJNI (); test.muestraHolaMundo(); } static { } }
- Guardamos el archivo como HolaMundoJNI.java y pasamos a la consola del sistema ingresamos a la carpeta creada anteriormente (con cd) y llamamos al compilador de JAVA (javac)
NOTA: Si no sale algun error, el compilador señalara la linea el comando que esta mal dentro de codigo
Después de haberlo compilado, pasamos a crear el archivo de cabecera o mas conocido como .h. Para esto debemos ejecutar una herramienta que lleva el JDK que se llama javah -jni y se aplica sobre el .class creado anteriormente.
Si observamos la carpeta donde estamos generando cada uno de los archivos podemos contar; un .class y un .h con el mismo nombre del .java, en mi caso HolaMundoJNI.java =O
ESTE ES EL ARCHIVO HOLAMUNDOJNI.H
[/list]
Código
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HolaMundoJNI */ #ifndef _Included_HolaMundoJNI #define _Included_HolaMundoJNI #ifdef __cplusplus extern "C" { #endif /* * Class: HolaMundoJNI * Method: muestraHolaMundo * Signature: ()V */ JNIEXPORT void JNICALL Java_HolaMundoJNI_muestraHolaMundo (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
[/list]
- 6. Programando en C:
Después de haber generado el .h, procedemos a crear el CODE en C, este es el código y sus anotaciones.HolaMundoJNIimpl.cCódigo- #include <jni.h>
- #include "HolaMundoJNI.h"
- #include <stdio.h>
- JNIEXPORT void JNICALL Java_HolaMundoJNI_muestraHolaMundo (JNIEnv *evn, jobject obj){
- return;
- }
- Podemos observar que declaramos un función
Después pasamos a compilar el código con el VISUAL C++
Después de haber ejecutado el comando, nos aparecerá unos errores de compilación, pero en si el fin de haber ejecutado este comando es generar los archivos para pasar a crear el DLL (el archivo .exp .obj y .lib)
Para crear la librería utilizamos el comando cl con el modificador -LD
Ya teniendo la libreria .dll ya es solamente es ejecutar el programa en java y LISTO!!! con el comando java
y el nombre del .class
LINK