使用JNI从C调用Java

使用JNI从C调用Java,java,c,java-native-interface,Java,C,Java Native Interface,我正在尝试以下代码从C代码调用Java函数performSHA。但我不断收到一个错误,在一些不是结构或联合的东西中说请求成员'DestroyJavaVM'。我已经在网上查看了几个链接,似乎我正在使用上面提到的链接 JavaVM *jvm; JNIEnv *env; JavaVMOption options[3]; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_2; JNI_GetDefaultJav

我正在尝试以下代码从C代码调用Java函数performSHA。但我不断收到一个错误,在一些不是结构或联合的东西中说请求成员'DestroyJavaVM'。我已经在网上查看了几个链接,似乎我正在使用上面提到的链接

JavaVM *jvm;       
JNIEnv *env;      
JavaVMOption options[3];
JavaVMInitArgs vm_args; 
vm_args.version  = JNI_VERSION_1_2;

JNI_GetDefaultJavaVMInitArgs(&vm_args);
options[0].optionString = "/home/amy/jni/";
vm_args.options  = options;

JNI_CreateJavaVM(&jvm, &env, &vm_args);
jclass cls = (*env)->FindClass(env, "CallToBCLib");
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "performSHA", "ILjava/lang/String;");
(*env)->CallStaticVoidMethod(cls, mid, algo_id, tc->m1);
jvm->DestroyJavaVM();   <-- ERROR
FindClass、GetStaticMethodID和CallStaticVoidMethod的使用是否正确?performSHA是我正在调用的Java函数,algou_id,tc->m1是我对Java函数的参数…

根据,您应该为DestroyJavaVM函数提供一个JavaVM*vm类型的参数:

jint DestroyJavaVM(JavaVM *vm);
因此,用DestroyJavaVMjvm替换jvm->DestroyJavaVM


注意,在同一页上,有一个示例,其中DestroyJavaVM在代码JVM- > DeavyJavaVM中被调用,但这适用于C++,并且您提到了您试图调用来自C.< /P> < P>的java代码。这太长了,不能在评论中,所以我将它作为答案。 我在jni源代码中检查了如何访问DestroyJavaVM: 函数已定义,这是声明:

jint JNICALL jni_DestroyJavaVM(JavaVM *vm)
最后是一个函数调用表,用于在C源代码中使用

规范给出了JavaVM类型的定义。 我们可以看到JavaVM类型的定义是函数调用表本身

这意味着我们需要获取jvm变量并访问其DestroyJavaVM函数, 同时还要传递jvm实例本身,因此访问代码应该如下所示:

jvm->DestroyJavaVM(jvm);

我还没有对此进行测试,这样调用函数有点奇怪,但我猜这应该会起作用。

我通过以下操作解决了这个问题:

(*jvm)->DestroyJavaVM(jvm);

稍后谢谢。这与DestroyJavaVM的问题无关,但您正在取消对env的引用,尽管它已经是一个指针。之后,您尝试使用->运算符访问其成员,即使您拥有的不是JNIEnv*而是JNIEnv。@Daniel:*env->很好,只是在C中如何操作。JNIEnv本身就是一个指针。@Michael啊,我没有看到指针在类型定义中。。。为什么人们在C:\I尝试了jvm->DestroyJavaVM&jvm和DestroyJavaVM&jvm,但两者似乎都不起作用。这些声明有什么问题吗?DestroyJavaVM&jvm给出了未定义的引用错误。第一个选项给出了与上面文章中所述相同的错误…您应该按照以下方式使用它:DestroyJavaVMjvm更新了我的答案。DestroyJavaVMjvm这给出了未定义的引用错误。JNI_GetDefaultJavaVMInitArgs、JNI_CreateJavaVM和DestroyJavaVM给出了未定义的引用错误……make命令到底做了什么?没有这些细节,恐怕我帮不了你。这是运行make命令时使用的make文件。。。