我需要解释一下JNI for Android的代码行

时间:2015-02-27 11:22:18

标签: java android c++

我在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”?

感谢名单

1 个答案:

答案 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的内存地址的指针。