您需要取消引用“指向 JavaVM 指针的指针”。
这将起作用:
(*state->activity->vm)->AttachCurrentThread(...);
由于您使用的是 C,因此函数签名也会有所不同,因为您还需要传入指向 JavaVM 的指针。
尝试这个:
JavaVM *vm = state->activity->vm;
(*vm)->AttachCurrentThread(vm, &env, NULL);
看起来您是从 C 调用,而不是 C++。在这种情况下,JavaVM 有一个指向 JNIInvokeInterface 指针的 typedef。
这是该类型的标头定义(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++ 编译器的,正如您在标头定义中看到的那样,它被 typedef'ed 到一个结构中。
C 用法与 C++ 有点不同