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

I need explain of a code line of JNI for Android

本文关键字:Android 代码 for JNI 解释      更新时间:2023-10-16

我在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"也是什么意思?

感谢

编译为 C 代码时,JavaVM 是指针类型,但当编译为 C++ 时,它只是一个结构体。从jni.h

#ifdef __cplusplus
typedef JavaVM_ JavaVM;
#else
typedef const struct JNIInvokeInterface_ *JavaVM;
#endif

在C++代码中,JavaVM *jvm 是指向结构的指针,而在 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 内存地址的指针。