【问题标题】:Android JNI pthread_create "too many arguments, expected 1"Android JNI pthread_create“参数太多,预期为 1”
【发布时间】:2017-06-09 17:40:26
【问题描述】:

每次我在生活中使用pthread_create 时,都需要四个参数。出于某种原因,在使用 android 和 JNI 时尝试在 C 中创建线程时,我看到了这个:

发生了什么

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

为什么我没有看到它?

编辑:

更奇怪的是,我对面点击了我的#include <pthread.h>,然后点击了Go to->Declaration,然后向下滚动直到看到pthread_create,它显示了正确的函数定义。

编辑 2:

更奇怪的是,我现在意识到它编译得很好。这与编辑有关。如果我输入四个参数,它会在编辑器中显示“预期 1 个参数”,但它编译时没有任何问题。但是,如果我只提供编辑器想要的 1 个参数,则无法编译错误日志中的“预期 4 个参数”。

我不知道它发生了什么。

【问题讨论】:

  • C 函数有原型和定义,而不是签名。
  • @AndrewHenle 谢谢,已更新。
  • 你是如何编译你的代码的?看起来 pthread_create() 的错误声明存在于某处,可能在头文件中。
  • @AndrewHenle 检查我上次的编辑。我觉得编辑器只是出于某种原因很奇怪。我还完成了一个完整的项目搜索,包括外部标头,但没有针对pthread_create 的其他定义的结果
  • 这是哪个编辑器?

标签: android c java-native-interface


【解决方案1】:

看起来 Android Studio 对现在在 NDK r15 中使用的 _Nonnull 很不满意。你可以选择GCC编译器

android { defaultConfig { externalNativeBuild { ndkBuild { 
   arguments "NDK_TOOLCHAIN_VERSION=4.9" 
}}}}

或者您可以禁用新的Unified Headers

android { defaultConfig { externalNativeBuild { ndkBuild { 
   arguments "APP_DEPRECATED_HEADERS=true" 
}}}}

或者您可以切换到NDK r14 或更早。

我已经为 Android Studio/C++ 开发者打开了issue

【讨论】:

  • 所以,事实证明我已经在使用 r14,但我为其他不再需要的东西启用了统一的标头。在我删除它后,它解决了这个问题,再次感谢 Alex!
【解决方案2】:

需要插入临时定义

#ifndef _Nonnull
#define _Nonnull
#endif

到 pthread.h 以防止 Android Studio 显示错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2021-09-21
    • 2012-11-03
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多