- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的项目中有一些 native 代码。我使用具有单调时间的 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”吗?
经过一些研究,我发现现在 HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
(和 pthread_cond_timedwait_monotonic_np
)应该为非 x64 目标定义(“armeabi-v7a”、“armeabi”、 “x86”,“mips”)。它被定义了。但现在还没有定义。
所以,“armeabi-v7a”、“x86”、“mips”既没有定义 HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
也没有定义 pthread_condattr_setclock
,所以我的项目无法构建对于这些目标。
那么,这是什么原因,我有哪些选择?
我不应该以某种方式使用单调等待那个目标吗?
我不应该为这些目标构建吗?
我应该恢复到旧版 NDK 吗?
或者我应该写信给 google groups 吗?
最佳答案
pthread_condattr_setclock
添加到 android-21: https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt#780 ,所以这就是您无法在旧版本上访问它的原因。
HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
显然是在旧 header 中定义的。它真的不应该是(无论如何不是那个名字)。像这样的名称是 autoconf 生成的东西使用的约定,我们不应该重叠,因为这会导致 amcro 重新定义警告。写这张支票的更好方法是:
#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
这仍然不足以让您再次构建,因为当添加了实际的 POSIX API 时,pthread_cond_timedwait_monotonic_np
的声明从 header 中消失了。为了兼容性,我刚刚上传了一个更改以重新添加声明: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;构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44580542/
我的项目中有一些 native 代码。我使用具有单调时间的 pthread。但是我不擅长NDK开发。 使用单调时钟初始化和使用条件的 C 代码: int initMonotonicCond(pthre
我是一名优秀的程序员,十分优秀!