it-roy-ru.com

Android NDK и pthread

Я собираю проект Qt/C++ с помощью отдельного набора инструментов Android NDK. Я создал автономный набор инструментов с командой make-standalone-toolchain.sh --Arch = arm --toolchain = arm-linux-androideabi-4.9 --platform = 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, и не нашел объявления функции pthread_getaffinity_np.

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

7
sdomen

Is pthread functionality for Android limited?

AFAIK, да.

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.
3
Kazuki Sakamoto

Потоки POSIX (pthreads), по-видимому, не предусмотрены для -Host build модулей . По крайней мере, вот ошибка для сборки модуля 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 внутри external/boringssl/Android.mk перед директивой:

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)
0
Oleg Kokorin