繁体   English   中英

使用JNI从C调用Java

[英]Call Java from C using JNI

我正在尝试以下代码从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函数,而algo_id,tc-> m1是我对Java函数的参数...

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

jint DestroyJavaVM(JavaVM *vm);

因此,用DestroyJavaVM(jvm)替换jvm->DestroyJavaVM() DestroyJavaVM(jvm)

请注意,在同一页上,有一个“概述”用例子DestroyJavaVM()被称为在你的代码( jvm->DestroyJavaVM()但是这也适用于C ++和你提到你想从C调用Java代码。

这太久了,无法发表评论,因此我将其作为答案。 我检查了如何在jni源代码中访问DestroyJavaVM
该函数在此处定义,这是声明:

jint JNICALL jni_DestroyJavaVM(JavaVM *vm)

该页面底部是用于C源代码的函数调用表。

该规范在这里为我们提供了JavaVM类型的定义。
我们可以看到JavaVM类型的定义是函数调用表本身。

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

jvm->DestroyJavaVM(jvm);

我还没有测试过,调用这样的函数有点奇怪,但我猜想这应该起作用。

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

(*jvm)->DestroyJavaVM(jvm);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM