在Android 5.0(Lollipop)上运行时,使用APP_STL = c ++ _ shared挂起sscanf

时间:2015-01-08 18:43:33

标签: android android-ndk libc++

如果您使用c ++ _ shared(LLVM' libc ++)链接,并且您的应用至少使用pthread_create一次,那么对sscanfpthread_create之后)的任何调用都会挂起在pthread_mutex_lock

1 个答案:

答案 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
}