Llamando funciones de Java desde lenguaje C

Estoy tratando de llamar a las funciones de Java desde el código c. Usé el JNI como se explica en el ejemplo en http://www.ishaanguliani.com/content/calling-java-functions-c-linux-ubuntu-jni

Usé el mismo código y seguí los mismos pasos pero no consigo encontrar la impresión de la clase.

Depuré pero no encontré lo que hice mal.

Compartiendo mi código aquí

unions@universe:~/uni_tmp/jni/vvn$ cat MyC.c #include  #include  #include "MyJava.h" #include  JNIEnv* create_vm(JavaVM ** jvm) { JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption options; options.optionString = "-Djava.class.path=./"; //Path to the java source code vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6 vm_args.nOptions = 1; vm_args.options = &options; vm_args.ignoreUnrecognized = 0; int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args); if(ret FindClass(env,"MyJava"); if (clsJava != NULL) { printf("\n Able to find the requested class\n"); } else { printf("\n Unable to find the requested class\n"); return 0; } mainMethod = (*env)->GetStaticMethodID(env, clsJava, "main", " ([Ljava/lang/String;)V"); smfnMethod = (*env)->GetStaticMethodID(env, clsJava,"sampleStaticFunc", "(Ljava/lang/String;)V"); if (mainMethod != NULL) { printf("\n Calling the Java Main method"); (*env)->CallStaticVoidMethod(env, clsJava, mainMethod, NULL); } StringArg = (*env)->NewStringUTF(env, "Argument from C"); if (smfnMethod != NULL) { printf("\n Calling the Static Function method"); (*env)->CallStaticVoidMethod(env, clsJava, smfnMethod, StringArg); } printf("\n End C main \n"); return 0; } 

Código Java

 cat unions@universe:~/uni_tmp/jni/vvn$ cat MyJava.java public class MyJava { public MyJava() { System.out.println("\n Inside the constrcutor of Java Function \n "); } private void sampleFunc(String str) { System.out.println("\n Inside sampleFunc value of string = " + str); } public static void sampleStaticFunc(String str) { System.out.println("\n Inside static sampleFunc value of string = " + str); } public static void main(String[] args) { MyJava obj = new MyJava(); obj.sampleFunc("Ishaan is my name"); System.out.println("\n Calling Java from C function \n"); } } 

Después de eso corrió estos comandos.

 unions@universe:~/uni_tmp/jni/vvn$ javac MyJava.java unions@universe:~/uni_tmp/jni/vvn$ javah -jni MyJava 

Cuando compilé y corrí obtuve esta salida

 export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server unions@universe:~/uni_tmp/jni/vvn$ gcc -I /usr/lib/jvm/java-6-openjdk-amd64/include -I /usr/lib/jvm/java-6-openjdk-amd64/include/linux -L /usr/bin/java -L /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server MyC.c -ljvm ; ./a.out Unable to find the requested class 

Donde hice mal?

Cambié el options.optionString para que me guste esto también

 options.optionString = "-Djava.class.path=/home/vpraveen/uni_tmp/jni/vvn"; 

Aunque no hay cambio en la salida. ¿Alguna sugerencia?

Resolví esto haciendo mi clase en mi propio paquete. Cuando no definimos ningún paquete, está tomando como paquete predeterminado. Así que creé mi propio paquete algo como esto

 package com.aqu.vvn 

Sé que es un trabajo alrededor pero hacer esto funcionó para mí. Te lo haré saber exactamente cuando me di cuenta.