1

我正在使用 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
4

1 回答 1

2

您需要取消引用“指向 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++ 有点不同

于 2017-09-05T07:47:03.627 回答