Android NDK и pthread

я компилирую проект Qt / C++ с автономной цепочкой инструментов android NDK. Я создал автономную toolchain с make-standalone-toolchain.sh --arch=arm --toolchain=arm-linux-androideabi-4.9 --платформа=Android-21 команда. Версия NDK-android-ndk-r10e. Целевой проект использует некоторые функции из библиотеки pthread. Во время компиляции я получаю следующую ошибку:

error: 'pthread_getaffinity_np' was not declared in this scope
const int err = pthread_getaffinity_np(_pthreadId, sizeof(cpu_set_t), &cpuSetMask);
compilation terminated due to -Wfatal-errors.

Я проверил заголовок pthread, включенного в NDK toolchain, и я не нашел объявление функция pthread_getaffinity_np.

ограничена ли функциональность pthread для Android? Как правильно использовать pthread с Android NDK?

2 ответов


Is pthread functionality for Android limited?

насколько я знаю, да.

http://mobilepearls.com/labs/native-android-api/#pthreads

POSIX threads (pthreads)
The android libc, bionic, provides built-in support for pthreads, so no
additional linking (-lpthreads) is necessary. It does not implement full
POSIX threads functionality and leaves out support for read/write locks,
pthread_cancel(), process-shared mutexes and condition variables as well as
other more advanced features. Read the bionic OVERVIEW.txt for more
information.

TLS, thread-local storage, is limited to 59 pthread_key_t slots available
to applications, lower than the posix minimum of 128.

потоки POSIX (pthreads), похоже, не предусмотрены для хоста создания модулей. по крайней мере, вот ошибка для сборки модуля libcrypto-host:

out/host/linux-x86/obj/SHARED_LIBRARIES/libcrypto-host_intermediates/src/crypto/thread_pthread.o: 
In function `thread_local_init':
/media/compilation/projects/android/beagle2/external/boringssl/src/crypto/thread_pthread.c:112: 
undefined reference to `pthread_key_create'

и единственный способ исправить это до сих пор-добавить -lpthread внутри внешний / boringssl / Android.МК перед директивой:

include $(BUILD_HOST_SHARED_LIBRARY)

пример:

# Host shared library
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libcrypto-host
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
LOCAL_MULTILIB := both
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk $(LOCAL_PATH)/crypto-sources.mk
LOCAL_CFLAGS += -fvisibility=hidden -DBORINGSSL_SHARED_LIBRARY -DBORINGSSL_IMPLEMENTATION -Wno-unused-parameter
LOCAL_CFLAGS += -DOPENSSL_NO_ASM
LOCAL_LDLIBS += -lpthread
include $(LOCAL_PATH)/crypto-sources.mk
include $(BUILD_HOST_SHARED_LIBRARY)