Android NativeActivity:AttachCurrentThread JNIInvokeInterface 不是结构或联合
Android NativeActivity: AttachCurrentThread JNIInvokeInterface is not a structure or union
我正在使用 C 中的 NativeActivity。
我的目标是获得对 JNIEnv 的引用,以便我可以进行进一步的 Android 调用。
根据我在 Android 文档和 Whosebug 上收集的示例,我一直看到这个
state->activity->vm->AttachCurrentThread(&env, NULL);```
但是我一直收到这个错误...
error: member reference base type 'JavaVM' (aka 'const struct JNIInvokeInterface *') is not a structure or union
您需要取消引用您的 "pointer to a JavaVM pointer"。
这会起作用:
(*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 编译器,您在指向指针的指针上调用函数,这导致了您描述的错误:"not a structure or a union".
但是您使用的示例是针对 C++ 编译器的,正如您在 header 定义中看到的那样,它被类型定义为结构。
C 的用法与 C++ 有点不同
我正在使用 C 中的 NativeActivity。 我的目标是获得对 JNIEnv 的引用,以便我可以进行进一步的 Android 调用。
根据我在 Android 文档和 Whosebug 上收集的示例,我一直看到这个
state->activity->vm->AttachCurrentThread(&env, NULL);```
但是我一直收到这个错误...
error: member reference base type 'JavaVM' (aka 'const struct JNIInvokeInterface *') is not a structure or union
您需要取消引用您的 "pointer to a JavaVM pointer"。
这会起作用:
(*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 编译器,您在指向指针的指针上调用函数,这导致了您描述的错误:"not a structure or a union".
但是您使用的示例是针对 C++ 编译器的,正如您在 header 定义中看到的那样,它被类型定义为结构。
C 的用法与 C++ 有点不同