对于某些构建目标,NDK构建器r15既未找到HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC,也未找到pthread_condattr_setclock;构建失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于某些构建目标,NDK构建器r15既未找到HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC,也未找到pthread_condattr_setclock;构建失败相关的知识,希望对你有一定的参考价值。

我的项目中有一些本机代码。我使用单调时间的pthread。但我在NDK开发方面并不擅长。

使用单调时钟初始化和使用条件的C代码:

int initMonotonicCond(pthread_cond_t *cond) {
    int result = 0;
#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
    result = pthread_cond_init(cond, NULL);
#else
    pthread_condattr_t cond1attr;
    result |= pthread_condattr_init(&cond1attr);
    result |= pthread_condattr_setclock(&cond1attr, CLOCK_MONOTONIC);
    result |= pthread_cond_init(cond, &cond1attr);
    pthread_condattr_destroy(&cond1attr);
#endif
    return result;
}

void monothonicWait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *ts) {
#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
    pthread_cond_timedwait_monotonic_np(cond, mutex, ts);
#else
    pthread_cond_timedwait(cond, mutex, ts);
#endif
}

Gradle构建ndk项目

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 24
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            externalNativeBuild {
                cmake {
                    cppFlags "-fexceptions -frtti -fPIE -fPIC"
                    abiFilters "armeabi-v7a", "armeabi", "arm64-v8a", "x86", "x86_64", "mips", "mips64"
                }
            }
        }
        debug {
            externalNativeBuild {
                cmake {
                    cppFlags "-fexceptions -frtti -fPIE -funwind-tables -DDEBUG -fPIC"
                    abiFilters "armeabi"
                }
            }
        }
    }
.....
}

最近我将Android Studio和所有SDK内容更新到了更新的版本。我猜,ndk构建到r15。现在我在构建时遇到错误:

错误:(155,15)错误:使用未声明的标识符'pthread_condattr_setclock';你是说'pthread_condattr_setpshared'吗?

经过一些研究后,我发现现在应该为非x64目标(“armeabi-v7a”,“armeabi”,“x86”,“mips”)定义qazxsw poi(和qazxsw poi)。它被定义了。但现在还没有定义。

因此,“armeabi-v7a”,“x86”,“mips”没有定义HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONICpthread_cond_timedwait_monotonic_np定义,所以我的项目不能为theese目标建立。

那么,这是什么原因以及我有哪些选择?

我不应该使用monothonic等待目标吗?

我不应该为这些目标而建立吗?

我应该恢复到较旧的NDK吗?

或者我应该写谷歌小组吗?

答案

HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC被添加到android-21:pthread_condattr_setclock中,这就是为什么你不能在旧版本上访问它。

pthread_condattr_setclock显然是在旧标题中定义的。它真的不应该(无论如何都没有这个名字)。这样的名称是autoconf生成的东西使用的约定,我们不应该重叠,因为这可能导致am​​cro重定义警告。编写此检查的更好方法是:

https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt#780

这仍然不足以让你再次建立,因为当实际的POSIX API被添加时,HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC的声明从标题中消失了。为了兼容性,我刚刚上传了一个更改以重新添加声明:#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21

不幸的是,将它变成r15b为时已晚。在此期间您可以做的是为该函数添加您自己的声明:

pthread_cond_timedwait_monotonic_np

以上是关于对于某些构建目标,NDK构建器r15既未找到HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC,也未找到pthread_condattr_setclock;构建失败的主要内容,如果未能解决你的问题,请参考以下文章

目标x86_64的NDK构建导致错误

cocos creator 03 构建项目出错的问题 无法找到NDK

在 Android NDK 项目中使用我自己的预构建共享库

尝试为 arm64 构建 apk 时出现链接器错误

如何让 Cargo 执行构建脚本并同时使用特定于目标的链接器?

Android NDK 多个 API 级别