我正在尝试以下代码从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函数的参数...
答案 0 :(得分:0)
根据documentation,应为JavaVM *vm
函数提供类型为DestroyJavaVM
的参数:
jint DestroyJavaVM(JavaVM *vm);
因此,将jvm->DestroyJavaVM()
替换为DestroyJavaVM(jvm)
。
请注意,在同一页面上,有一个“概述”,其中示例如代码(DestroyJavaVM()
中那样调用jvm->DestroyJavaVM()
,但这适用于C ++,并且您提到要调用来自C的Java代码。
答案 1 :(得分:0)
这太长了,无法发表评论,因此我将其作为答案。
我在jni源代码中检查了如何访问DestroyJavaVM
:
该函数定义为here,这是声明:
jint JNICALL jni_DestroyJavaVM(JavaVM *vm)
在bottom of that page处是一个函数调用表,用于C源代码。
该规范为我们提供了JavaVM类型here的定义。
我们可以看到JavaVM类型的定义是函数调用表本身。
这意味着我们需要使用jvm
变量并访问其DestroyJavaVM
函数,
同时还传递了jvm实例本身,因此访问代码应如下所示:
jvm->DestroyJavaVM(jvm);
我还没有测试过,调用这样的函数有点奇怪,但我想这应该可以工作。
答案 2 :(得分:0)
我通过以下操作解决了这个问题:
2017