[APORTE by 4ng3r]Java, C y DLL

Iniciado por AFelipeTrujillo, 17 Febrero 2010, 18:59 PM

0 Miembros y 1 Visitante están viendo este tema.

AFelipeTrujillo

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  :xD 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  :xD




  • 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 !!!! :xD

    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 (java) [Seleccionar]
public class HolaMundoJNI{

public native void muestraHolaMundo(); //invocamos el Metodo NATIVO

public static void main (String arg []){

HolaMundoJNI  test = new HolaMundoJNI ();
test.muestraHolaMundo();
}

static {
System.loadLibrary("libreria"); // Cargamos la Libreria DLL generada mas Adelante ;)
}


}


    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]/* 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.c

    #include <jni.h>
    #include "HolaMundoJNI.h"
    #include <stdio.h>

    JNIEXPORT void JNICALL Java_HolaMundoJNI_muestraHolaMundo (JNIEnv *evn, jobject obj){

    printf("Hola Mundo!!!");
    return;
    }


      Podemos observar que declaramos un función
    JNIEXPORT que no retorna nada (void) y como parámetros tiene un evento (*env) y un Object (obj) y es la misma función que esta llamando el .h... y en esta función escribimos todo el codigo que queramos  :xD

    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




Leyer

hee esto es basico pero esta bien explicado es un buen aporte para los novatos en JNI

Un Saludo!

Amerikano|Cls

Aportaso men!!!! me sera de gran utilidad para incursionar en el JNI ... mil gracias  ;-) ;-) ;-)




Mi blog:
http://amerikanocls.blogspot.com

AFelipeTrujillo

0k gracias espero que sea de gran aporte !!

kasiko

Nos vemos...


trachtenberg

-=trachtenberg=-

trachtenberg

hay algo que no me funciono bien al final al ejecutar  java HolaNativo(asi su nombre )


Exception in theard "main" java.lang.unsupportedCalssVersionError:HolaNativo:
Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HolaNativo.  Program will exit.


lei que puede se el set CLASSPATH ..
toy haciendo pruebas
-=trachtenberg=-

trachtenberg

Cita de: trachtenberg en 30 Septiembre 2011, 18:44 PM
hay algo que no me funciono bien al final al ejecutar  java HolaNativo(asi su nombre )


Exception in theard "main" java.lang.unsupportedCalssVersionError:HolaNativo:
Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HolaNativo.  Program will exit.


lei que puede se el set CLASSPATH ..
toy haciendo pruebas

el problema era las versiones tenia 2 diferntes  por el netbeans y el CLASSPATH  _reistale todo
-=trachtenberg=-