我在GitHub上发现了这个例子,https://github.com/martinmarinov/rtl_tcp_andro-/blob/master/jni/RtlTcp.c我希望了解它是如何工作的。 关于一些带指针的代码,我有一个问题。
这是函数的代码:
static JavaVM *jvm;
void thread_detach() {
JNIEnv *env;
if ((*jvm)->GetEnv(jvm, (void **)&env, javaversion) == JNI_OK) {
(*jvm)->DetachCurrentThread(jvm);
}
}
如果jvm是指针,他怎么能使用运算符 - >和*在一起?在我的编译器中这是一个错误点。有任何想法吗 ? 什么也意味着“(void **)& env”?
感谢名单
答案 0 :(得分:0)
当编译为C代码时,JavaVM
是指针类型,但是当编译为C ++时,它只是一个结构。来自jni.h
:
#ifdef __cplusplus
typedef JavaVM_ JavaVM;
#else
typedef const struct JNIInvokeInterface_ *JavaVM;
#endif
在C ++代码中,JavaVM *jvm
是指向struct的指针,而在C代码中,JavaVM *jvm
是指向到JNIInvokeInterface_
的指针。
然后(*jvm)
对第一个指针进行引用,给出指向JNIInvokeInterface_
的指针。
此外,JavaVM_
(C ++)定义jint GetEnv(void **penv, jint version)
,而JNIInvokeInterface_
(C)定义jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version)
。
然后我们在C中进行以下调用:
(*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_4);
在C ++中它是:
jvm->GetEnv((void **)&env, JNI_VERSION_1_4);
请注意,在{两种语言中,penv
参数的类型为void**
,它是指向env
的内存地址的指针。