
我的项目中有一些本机代码.我使用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”)定义HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC(和pthread_cond_timeDWait_monotonic_np).并已定义.但是现在还没有定义.
因此,“ armeabi-v7a”,“ x86”,“ mips”还没有定义HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC或pthread_condattr_setclock都没有定义,因此我的项目无法针对这些目标构建.
那么,这是什么原因,我有什么选择?
我不应该以单声道方式等待该目标吗?
我不应该为那些目标而建造吗?
我应该还原到较旧的NDK吗?
还是我应该写信给Google网上论坛?
解决方法:
pthread_condattr_setclock已在androID-21:https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt#780中添加,因此这就是为什么您无法在较早版本上访问它的原因.
HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC显然是在旧标题中定义的.确实不应该这样(无论如何都不用这个名字).像这样的名称是autoconf生成的事物所使用的约定,我们不应重叠,因为这可能会引起amcro重新定义警告.编写此检查的更好方法是:
#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21但是,这还不足以让您再次构建,因为在添加了实际的POSIX API时,标头中就消失了pthread_cond_timeDWait_monotonic_np的声明.为了兼容起见,我刚刚上传了一个更改以重新添加声明:https://android-review.googlesource.com/420945
不幸的是,现在将它纳入r15b为时已晚.同时,您可以做的就是为该函数添加自己的声明:
extern "C" int pthread_cond_timeDWait_monotonic_np( pthread_cond_t*, pthread_mutex_t*, const struct timespec*); 总结 以上是内存溢出为你收集整理的android-NDK构建器r15找不到某些构建目标的HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC或pthread_condattr_setclock;构建失败全部内容,希望文章能够帮你解决android-NDK构建器r15找不到某些构建目标的HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC或pthread_condattr_setclock;构建失败所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)