elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  [APORTE by 4ng3r]Java, C y DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [APORTE by 4ng3r]Java, C y DLL  (Leído 13,817 veces)
AFelipeTrujillo

Desconectado Desconectado

Mensajes: 160



Ver Perfil WWW
[APORTE by 4ng3r]Java, C y DLL
« en: 17 Febrero 2010, 18:59 pm »

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
  1. public class HolaMundoJNI{
  2.  
  3. public native void muestraHolaMundo(); //invocamos el Metodo NATIVO
  4.  
  5. public static void main (String arg []){
  6.  
  7. HolaMundoJNI  test = new HolaMundoJNI ();
  8. test.muestraHolaMundo();
  9. }
  10.  
  11. static {
  12. System.loadLibrary("libreria"); // Cargamos la Libreria DLL generada mas Adelante ;)
  13. }
  14.  
  15.  
  16. }
    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
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class HolaMundoJNI */
  4.  
  5. #ifndef _Included_HolaMundoJNI
  6. #define _Included_HolaMundoJNI
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. /*
  11.  * Class:     HolaMundoJNI
  12.  * Method:    muestraHolaMundo
  13.  * Signature: ()V
  14.  */
  15. JNIEXPORT void JNICALL Java_HolaMundoJNI_muestraHolaMundo
  16.  (JNIEnv *, jobject);
  17.  
  18. #ifdef __cplusplus
  19. }
  20. #endif
  21. #endif
  22.  



[/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

    Código
    1. #include <jni.h>
    2. #include "HolaMundoJNI.h"
    3. #include <stdio.h>
    4.  
    5. JNIEXPORT void JNICALL Java_HolaMundoJNI_muestraHolaMundo (JNIEnv *evn, jobject obj){
    6.  
    7. printf("Hola Mundo!!!");
    8. return;
    9. }
      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





En línea

Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: [APORTE by 4ng3r]Java, C y DLL
« Respuesta #1 en: 18 Febrero 2010, 01:10 am »

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

Un Saludo!


En línea

Amerikano|Cls


Desconectado Desconectado

Mensajes: 789


[Beyond This Life]


Ver Perfil WWW
Re: [APORTE by 4ng3r]Java, C y DLL
« Respuesta #2 en: 18 Febrero 2010, 03:56 am »

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





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

Desconectado Desconectado

Mensajes: 160



Ver Perfil WWW
Re: [APORTE by 4ng3r]Java, C y DLL
« Respuesta #3 en: 18 Febrero 2010, 22:56 pm »

0k gracias espero que sea de gran aporte !!
En línea

kasiko

Desconectado Desconectado

Mensajes: 218



Ver Perfil
Re: [APORTE by 4ng3r]Java, C y DLL
« Respuesta #4 en: 25 Febrero 2010, 20:49 pm »

Se agradece la ayuda  ;-)
En línea

Nos vemos...

trachtenberg

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: [APORTE by 4ng3r]Java, C y DLL
« Respuesta #5 en: 30 Septiembre 2011, 18:38 pm »

Gracias por el aporte =)
En línea

-=trachtenberg=-
trachtenberg

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: [APORTE by 4ng3r]Java, C y DLL
« Respuesta #6 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
En línea

-=trachtenberg=-
trachtenberg

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: [APORTE by 4ng3r]Java, C y DLL
« Respuesta #7 en: 30 Septiembre 2011, 20:57 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
En línea

-=trachtenberg=-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Aporte] Java-Leer cantidades (consola)
Java
Senior++ 2 2,743 Último mensaje 16 Julio 2012, 06:26 am
por hucruz
[Aporte-Tutorial] Tu primera GUI-Java
Java
Senior++ 1 1,946 Último mensaje 29 Julio 2012, 00:26 am
por ChavalChavito
[APORTE] Videojuego en JAVA
Java
NullP0inter 4 4,219 Último mensaje 21 Diciembre 2014, 20:31 pm
por NullP0inter
[Aporte] Mejores practicas en Java
Java
3n31ch 8 27,407 Último mensaje 22 Julio 2015, 01:12 am
por shellb_c0de
[Aporte] Operadores de Java
Java
3n31ch 0 2,285 Último mensaje 3 Febrero 2015, 01:08 am
por 3n31ch
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines