我需要解释 JNI for Android 的代码行
I need explain of a code line of JNI for Android
我在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
内存地址的指针。
相关文章:
- Android Studio 中带有静态库的原生C++代码
- 如何在 Android Studio 4 中编译 C/C++ 原生代码
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 如何调试visual studio 2017生成的C++代码.android中的SO文件和其他第三方库
- 使用 Android NDK 使用 clang++ 编译C++代码时对"_Unwind_Resume"的未定义引用
- 如何通过用C++编写的代码将位图图像保存在Android设备中
- Android 无法从本机代码调用 Java 方法 JNI
- 在Android中运行没有ART/Dalvik参与的代码
- Android NDK-天然C 代码的静态分析
- Android Studio 调试原生代码 lldb 服务器工作无穷大
- 无法将Android WebView渲染到C 和Java代码之间共享的外部纹理中
- 使用 Android Studio 使用本机代码编译 apk 时,如何在链接处删除 libgnustl_static.
- Android Studio 项目中的 c++ 代码是否最终出现在 apk 文件中(除了 .so 文件)
- Android- AAR库的调试本机代码
- 如何在Android中使用OpenCV C 代码
- 将 c++ opencv 代码更改为 android 代码
- 天真地将Android代码移植到黑莓
- Qt on Android - C++代码是否在 Dalvik 虚拟机中运行
- 在android代码中创建一个套接字(而不是在android应用程序中)获得Permission Denied