【发布时间】:2019-04-09 05:04:07
【问题描述】:
我正在尝试使用以下代码从 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 函数的参数...
【问题讨论】:
-
github.com/clibs/sha1 稍后谢谢。
-
这与 DestroyJavaVM 的问题无关,但您正在取消引用 env 即使它已经是一个指针。之后,您尝试使用 -> 运算符访问其成员,即使您拥有的不是 JNIEnv * 而是 JNIEnv。
-
@Daniel:
(*env)->很好,简单来说就是你在 C 中的做法。JNIEnv本身就是一个指针。 -
@Michael 啊,我没有看到指针在 typedef 中...为什么人们在 C 中使用的代码中的 typedef 中隐藏星号:\
标签: java c java-native-interface