gpt4 book ai didi

java - Android NativeActivity : AttachCurrentThread JNIInvokeInterface is not a structure or union

转载 作者:行者123 更新时间:2023-11-30 00:22:18 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com