我的项目中有一些本机代码。我使用单调时间的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目标定义HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
(和pthread_cond_timedwait_monotonic_np
)(“armeabi-v7a”,“armeabi”,“x86”,“mips” “)。它被定义了。但现在没有定义。
所以,“armeabi-v7a”,“x86”,“mips”没有定义HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
或pthread_condattr_setclock
定义,所以我的项目不能为theese目标构建。
那么,这是什么原因以及我有哪些选择?
我不应该用某种方式使用monothonic等待目标吗?
我不应该为这些目标而建立吗?
我应该恢复旧的NDK吗?
或者我应该写一下谷歌小组吗?
答案 0 :(得分:3)
pthread_condattr_setclock
,这就是为什么你无法在旧版本中访问它。
HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
显然是在旧标题中定义的。它真的不应该(无论如何都没有这个名字)。这样的名称是autoconf生成的东西使用的约定,我们不应该重叠,因为这可能导致amcro重定义警告。编写此检查的更好方法是:
#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
这仍然不足以让你再次构建,因为pthread_cond_timedwait_monotonic_np
的声明在添加了实际的POSIX API时从标题中消失了。为了兼容性,我刚刚上传了一个更改以重新添加声明:https://android-review.googlesource.com/420945
不幸的是,将它变成r15b为时已晚。在此期间你可以做的是为这个函数添加你自己的声明:
extern "C" int pthread_cond_timedwait_monotonic_np(
pthread_cond_t*, pthread_mutex_t*, const struct timespec*);