Android NativeActivity:AttachCurrentThread JNIInvokeInterface不是结构或联合

时间:2017-09-05 07:45:32

标签: java android multithreading native-activity android-thread

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

1 个答案:

答案 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 ++略有不同