从C语言调用Java函数

我想从c代码调用java函数。 我在http://www.ishaanguliani.com/content/calling-java-functions-c-linux-ubuntu-jni的示例中讨论过JNI 。

我使用相同的代码并遵循相同的步骤,但我无法找到类打印。

我调试但我没找到我做错了什么。

在这里分享我的代码

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; } 

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"); } } 

在那之后Ran这些命令

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

当我编译和然后我得到了这个输出

 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 

我哪里做错了?

我将options.optionString更改为这样

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

即使输出没有变化。 有什么建议?

我通过将我的课程变成我自己的包来解决这个问题。 当我们没有定义任何包时,它将作为默认包。 所以我创建了自己的包这样的东西

 package com.aqu.vvn 

我知道它的解决方法,但这样做对我有用。 当我想出来时,我会让你知道确切的方法。