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:
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:
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(&vm_args,0,sizeof(vm_args)); vm_args.version=JNI_VERSION_1_2; vm_args.nOptions=1; vm_args.options=options; status=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); if( status != JNI_ERR){ cls=(*env)->FindClass(env,"MiClase"); if(cls !=0){ mid=(*env)->GetStaticMethodID(env,cls,"potenciaDos","(I)I"); if(mid!=0){ square=(*env)->CallStaticIntMethod(env,cls,mid,5); printf("Resultado de la potencia %d\n",square); } mid=(*env)->GetStaticMethodID(env,cls,"negar","(Z)Z"); if(mid!=0){ not=(*env)->CallStaticBooleanMethod(env,cls,mid,1); printf("Resultado de negar %d\n",not); } } (*jvm)->DestroyJavaVM(jvm); return 0; }else{ return -1; } } |
Comentarios
Publicar un comentario