Implementación JNI en Windows

  • (Actualizado el día 21 de Enero de 2009)

Requisitos:
Contar con el Visual Studio y tener instalado el Visual C++

Agradecimientos:
http://fercufer.wikispaces.com/jni.htm

El primer paso es configurar en las variables de Entorno de Windows, el class path del Microsoft Visual Studio - Visual C++ Compiler.
Contar con un IDE Yo recomiendo el JCreator LE de la página:
http://www.jcreator.com/download.htm, es muy bueno! Cómpralo! (La publicidad se la doy porque me ha gustado)

La variable de entorno path debe contener la ruta
C:\Archivos de programa\Microsoft Visual Studio\VC98\Bin

La variable de entorno lib debe contener la ruta
C:\Archivos de programa\Microsoft Visual Studio\VC98\lib

La variable de entorno include debe contener la ruta
C:\Archivos de programa\Microsoft Visual Studio\VC98\include

Archivo Hola.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hola */
#ifndef _Included_Hola
#define _Included_Hola
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hola
* Method: decirHola
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hola_decirHola
(JNIEnv *, jobject);
 
JNIEXPORT jstring JNICALL
Java_Hola_decir(JNIEnv *, jobject, jstring , jint);
 
JNIEXPORT jstring JNICALL
Java_Hola_m1(JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif
 

Archivo Hola.c
#include <jni.h>
#include <stdio.h>
#include "Hola.h"
 
 
JNIEXPORT void JNICALL Java_Hola_decirHola (JNIEnv *env, jobject obj) {
  //printf("Hola Mundo!\n");
  return;
}
 
 
JNIEXPORT jstring JNICALL Java_Hola_decir(JNIEnv *env, jobject obj, jstring msg , jint valor)  {
 
  /* Acceder a una variable de Tipo String */
  jclass   clase      ;     // Referenciar La clase
  jfieldID atributoNumero ; // Referenciar el atributo
  jfieldID atributoData   ; // Referenciar el atributo
  jstring  jstr;
  char buf[128];            // Buffer de respuesta
  const char *str;
  int n = 0;
 
   clase          = (*env)->FindClass(env,"Hola");
   atributoNumero = (*env)->GetFieldID(env,clase,"numero","I");
   atributoData   = (*env)->GetFieldID(env,clase,"data","Ljava/lang/String;");
 
  if (atributoNumero==NULL) {
      printf("C : 1 , JNI.Error No encontró el atributo numero");
      return 0;
  } else {
       n = (*env)->GetIntField(env,obj,atributoNumero);
       printf("C : 1 , Numero es : (%d)\n",n);
  }
 
  if (atributoData==NULL) {
      printf("C : 2 , JNI.Error No encontró el atributo data");
      return 0;
  } else {
        jstr = (*env)->GetObjectField(env, obj, atributoData );
        str = (*env)->GetStringUTFChars(env, jstr, 0);
        printf("C : 2 , Data es : (%s)\n",str);
  }
 
  /* Manipular Los String Acceder a los argumentos */
 
  str = (*env)->GetStringUTFChars(env,msg, 0);     // Acceder a un atributo de Tipo String
  printf("C : 3 , Parámetro  %s", str);
  (*env)->ReleaseStringUTFChars(env, msg, str);    // Liberar Memoria
  printf("\nInput?");
  scanf("%s",buf);
  return (*env)->NewStringUTF(env,buf);            //Devolver un argumento de tipo String
}
 
JNIEXPORT jstring JNICALL
Java_Hola_m1(JNIEnv * env , jobject obj){
  char resp[128];
  return (*env)->NewStringUTF(env,resp);
}

procedemos a ejecutar el siguiente archivos por lotes (compilar.bat
):

cl -IC:\jdk1.5.0_04\include -IC:\jdk1.5.0_04\include\win32 -LD Hola.c -FelibHola.dll
del *.exp
del *.lib
del *.*ak
del *.obj
pause

El resultado será

>cl -IC:\jdk1.5.0_04\include -IC:\jdk1.5.0_04\include\win32 -LD Hola.c -FelibHola.dll
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
 
Hola.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
 
/dll
/implib:libHola.lib
/out:libHola.dll
Hola.obj
   Creating library libHola.lib and object libHola.exp

y la ejecución nos genera el archivo libHola.dll
:

Creamos la Clase (Hola) Java que invoará la libreria.

public class Hola {
 
  public String data = "Fabio";
  public int    numero = 32;
 
  public native void decirHola();
 
  public native String decir(String a , int b);
 
  public native String m1();
 
  static {
    System.loadLibrary("libHola");
  }
 
  public static void main(String args[]) {
    Hola holaMundo = new Hola();
     holaMundo.decirHola();
     String a = holaMundo.decir("Mensaje!!!",23);
     System.out.println("Java 1 : Devolvio '"+a+"'");
       System.out.flush();
     System.out.println("Java 2 : Ingresar Dato?");
       System.out.flush();
     a = holaMundo.m1();
     System.out.println("Java 3 : "+holaMundo.data);
       System.out.flush();
  }
}

Finalmente nos crea una Clase Java Ejecutable.
Que podremos Invocar como:
java Hola
Hola Mundo!

Se adjuntan los archivos usados para correr el ejercicio:

Versión 1:
Es muy sencilla ideal para iniciarse.


Versión 2:
Es más completa.


Redactado por :
Fabio Andrés Palmiery Villa

Adaptada de:
http://afrodita.unicauca.edu.co/~dparedes/java/jdcbook/jniexamp.html

agradecimientos:

  • Xinos Software Corp.
  • Microsoft Corp.
  • Unicauca.