作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 C 中的 NativeActivity。我的目标是获取对 JNIEnv 的引用,以便我可以进行进一步的 Android 调用。
根据我在 Android 文档和 Stackoverflow 上收集的示例,我不断看到这一点
state->activity->vm->AttachCurrentThread(&env, NULL);```
但我一直收到这个错误...
error: member reference base type 'JavaVM' (aka 'const struct JNIInvokeInterface *') is not a structure or union
最佳答案
您需要取消引用“指向 JavaVM 指针的指针”。
这会起作用:
(*state->activity->vm)->AttachCurrentThread(...);
由于您使用的是 C,函数签名也会有所不同,因为您还需要传入一个指向 JavaVM 的指针。
试试这个:
JavaVM *vm = state->activity->vm;
(*vm)->AttachCurrentThread(vm, &env, NULL);
看起来您是从 C 而不是 C++ 调用。在这种情况下,JavaVM 有一个指向 JNIInvokeInterface 指针的 typedef。
这是该类型的 header 定义 (jni.h)
struct _JavaVM;
typedef const struct JNINativeInterface* C_JNIEnv;
#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
typedef _JavaVM JavaVM;
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif
使用 C 编译器,您在指向指针的指针上调用函数,这会导致您描述的错误:“不是结构或联合”。
但是您使用的示例是针对 C++ 编译器的,正如您在 header 定义中看到的那样,它被类型定义为一个结构。
C 的用法与 C++ 有点不同
关于java - Android NativeActivity : AttachCurrentThread JNIInvokeInterface is not a structure or union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46049554/
我是一名优秀的程序员,十分优秀!