Appeler des fonctions Java à partir du langage C

Je suis en train d’appeler pour appeler des fonctions java à partir du code c. J’ai utilisé le JNI comme indiqué dans l’exemple à l’ adresse http://www.ishaanguliani.com/content/calling-java-functions-c-linux-ubuntu-jni

J’ai utilisé le même code et suivi les mêmes étapes, mais je n’arrive pas à trouver l’impression de la classe.

J’ai débogué mais je n’ai pas trouvé ce que j’avais mal fait.

Partager mon code ici

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.optionSsortingng = "-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/Ssortingng;)V"); smfnMethod = (*env)->GetStaticMethodID(env, clsJava,"sampleStaticFunc", "(Ljava/lang/Ssortingng;)V"); if (mainMethod != NULL) { printf("\n Calling the Java Main method"); (*env)->CallStaticVoidMethod(env, clsJava, mainMethod, NULL); } SsortingngArg = (*env)->NewSsortingngUTF(env, "Argument from C"); if (smfnMethod != NULL) { printf("\n Calling the Static Function method"); (*env)->CallStaticVoidMethod(env, clsJava, smfnMethod, SsortingngArg); } printf("\n End C main \n"); return 0; } 

Code 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(Ssortingng str) { System.out.println("\n Inside sampleFunc value of ssortingng = " + str); } public static void sampleStaticFunc(Ssortingng str) { System.out.println("\n Inside static sampleFunc value of ssortingng = " + str); } public static void main(Ssortingng[] args) { MyJava obj = new MyJava(); obj.sampleFunc("Ishaan is my name"); System.out.println("\n Calling Java from C function \n"); } } 

Après que couru ces commandes

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

Quand j’ai compilé et Ran j’ai eu cette sortie

 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 

Où je me suis trompé?

J’ai changé les options.optionSsortingng pour aimer ça aussi

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

Même s’il n’y a pas de changement dans la sortie. Aucune suggestion?

J’ai résolu ce problème en transformant ma classe en mon propre package. Quand nous n’avons défini aucun paquet, il prend comme paquet par défaut. Alors j’ai créé mon propre paquet quelque chose comme ça

 package com.aqu.vvn 

Je sais que c’est un travail, mais cela a fonctionné pour moi Je vous ferai savoir le chemin exact quand je l’aurais trouvé.