【问题标题】:Android NativeActivity: AttachCurrentThread JNIInvokeInterface is not a structure or unionAndroid NativeActivity:AttachCurrentThread JNIInvokeInterface 不是结构或联合
【发布时间】:2018-02-13 10:18:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您需要取消引用“指向 JavaVM 指针的指针”。

    这将起作用:

    (*state->activity->vm)->AttachCurrentThread(...);
    

    由于您使用的是 C,因此函数签名也会有所不同,因为您还需要传入指向 JavaVM 的指针。

    试试这个:

    JavaVM *vm = state->activity->vm;
    
    (*vm)->AttachCurrentThread(vm, &env, NULL);
    

    看起来您是从 C 调用,而不是 C++。 在这种情况下,JNIInvokeInterface 指针的 JavaVM 有一个 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++ 有点不同

    【讨论】:

    • 额外的取消引用有效,我没有注意到。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多