gpt4 book ai didi

java - 我需要解释 Android 的 JNI 代码行

转载 作者:行者123 更新时间:2023-11-28 06:24:24 26 4
gpt4 key购买 nike

我在 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是一个指向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 内存地址的指针。

关于java - 我需要解释 Android 的 JNI 代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28763912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com