我正在使用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
答案 0 :(得分:1)
您需要取消引用指向JavaVM指针的指针"。
这将有效:
(*state->activity->vm)->AttachCurrentThread(...);
由于您使用的是C,因此您还需要传入指向JavaVM的指针,因此函数签名也会有所不同。
试试这个:
JavaVM *vm = state->activity->vm;
(*vm)->AttachCurrentThread(vm, &env, NULL);
看起来你是在用C调用,而不是用C ++调用。 在这种情况下,JavaVM的typedef指向JNIInvokeInterface指针。
这里是该类型的标题定义(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而不是。
C使用与C ++略有不同