如果您使用c ++ _ shared(LLVM' libc ++)链接,并且您的应用至少使用pthread_create
一次,那么对sscanf
(pthread_create
之后)的任何调用都会挂起在pthread_mutex_lock
。
答案 0 :(得分:1)
原因是在Google的“android_support”辅助库中无意义地使用'struct FILE'内部。这个结构很可能在Android 5.0 Bionic中发生了变化。
由于NDK r10d消除了android_support的错误sscanf
实施(在commit 47e68e84ee043436387a053c1cd47b97cabbb8ca中),因此它不再受到影响。如果您必须使用较旧的NDK,请将commit 47e68e84ee043436387a053c1cd47b97cabbb8ca作为临时修订应用于其中。
简单复制如下。
Application.mk:
APP_ABI := armeabi
APP_STL := c++_shared
APP_PIE := true
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
include $(BUILD_EXECUTABLE)
TEST.CPP:
#include <stdio.h>
#include <pthread.h>
void* threadproc(void *) {
return NULL;
}
int main(int argc, char **argv) {
pthread_t thread;
pthread_create(&thread, NULL, threadproc, NULL); // causes __isthreaded to be set
unsigned int foo;
sscanf("12345", "%u", &foo); // locks up by calling Bionic's flockfile on its own fake FLE
}