Llamando Java desde C

Una de las cosas interesantes que puedes hacer con Java es la posibilidad de utilizar JNI (Java Native Interface) que nos permite crear librerías desarrolladas en C especificas para un Hardware o arquitectura y utilizarlas desde la JVM, para mejorar la eficiencia de nuestros programas cuando se trata de poder de procesamiento.

Pero en esta ocasión intentaremos algo un poco distinto.

Que necesitamos:


  • Conocimiento en lenguaje C
  • Un entorno de desarrollo.
    • gcc.
    • JDK
    • Un editor como VIM.
  • Paciencia para no terminar destruyendo la maquina :)


Oracle ya cuenta con una documentación realmente muy bien explicada, ademas de que la API es intuitiva, mas si anteriormente haz programado en Java, la puedes consultar en el siguiente enlace:

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html

Primero necesitaremos la libreria jni.h que debemos buscar, si tienes una maquina de 64 bits se encontrara en /usr/lib/jvm/java-7-oracle/include/

Ahora que ya tenemos lo necesario, nos vamos al código:

Creamos nuestra clase en java:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <jni.h>
#include <string.h> 
int main(void){
 JavaVMOption options[1];
 JNIEnv *env;
 JavaVM *jvm;
 JavaVMInitArgs vm_args;
 long status;
 jclass cls;
 jmethodID mid;
 jint square;
 jboolean not;

 options[0].optionString="-Djava.class.path=.";
 memset(&amp;vm_args,0,sizeof(vm_args));
 vm_args.version=JNI_VERSION_1_2;
 vm_args.nOptions=1;
 vm_args.options=options;
 status=JNI_CreateJavaVM(&amp;jvm,(void**)&amp;env,&amp;vm_args);
 if( status != JNI_ERR){
  cls=(*env)-&gt;FindClass(env,"MiClase");
  if(cls !=0){
   mid=(*env)-&gt;GetStaticMethodID(env,cls,"potenciaDos","(I)I");
   if(mid!=0){
    square=(*env)-&gt;CallStaticIntMethod(env,cls,mid,5);
    printf("Resultado de la potencia %d\n",square);
   }
   mid=(*env)-&gt;GetStaticMethodID(env,cls,"negar","(Z)Z");
   if(mid!=0){
    not=(*env)-&gt;CallStaticBooleanMethod(env,cls,mid,1);
    printf("Resultado de negar %d\n",not);
   }
   
  }
  (*jvm)-&gt;DestroyJavaVM(jvm);
  return 0;
 }else{
  return -1;
 }



}



Comentarios

Entradas más populares de este blog

Instalación de PROXMOX (por usb)

Firmar y publicar una app de Cordova en Play Store

Método PERT.