Android ndk"undefined reference to pthread_atfork"
在我尝试为 Android 交叉编译 libpcsclite 时告诉我
实际上我已经知道Android的仿生库(Android docs)中没有pthread_atfork函数,但是pthread_atfork必须在pcsclite库中调用。在这种情况下有什么解决办法吗?
Android ndk"undefined reference to pthread_atfork"
在我尝试为 Android 交叉编译 libpcsclite 时告诉我
实际上我已经知道Android的仿生库(Android docs)中没有pthread_atfork函数,但是pthread_atfork必须在pcsclite库中调用。在这种情况下有什么解决办法吗?
看起来直到 android-10/v2.3.6/Gingerbread 之后pthread_atfork()
才添加到仿生 libc中。如果您想针对旧版本的 Android,您必须在项目中包含pthread-atfork.c或更新的pthread_atfork.cpp,或者根本不使用pthread_atfork()
。
看看这个:http ://comments.gmane.org/gmane.comp.handhelds.android.ndk/15982
我相信函数 pthread_atfork 是在 Bionic 库中实现的(但是,它没有记录在案)。
我认为你所要做的就是声明它来使用它。
通常的警告:如果您使用未记录的方法,它们可能无法正常工作或将来可能会被弃用。
-DANDROID_PLATFORM=android-21
此值默认为使用中的 NDK 支持的最低 API 级别
在我的上下文中,使用 android-9 默认值。
如果您在 ${ANDROID-NDK} DIR 上执行下面的 shell,
find_path=$1
grep_str=$2
SOS=`find ${find_path} -name *.so`
for item in $SOS
do
echo ======= $item
objdump -Tt $item |grep ${grep_str}
done
sh echo.sh . pthread_atfork
输出:
======= ./platforms/android-9/arch-mips/usr/lib/libc.so
======= ./platforms/android-12/arch-x86/usr/lib/libc.so
00009420 g F .text 0000000a pthread_atfork
00009420 g DF .text 0000000a LIBC pthread_atfork
您会发现这条消息:pthread_atfork
在 libc.so 上使用 android-12 而不是 android-9 定义。
所以当你使用 cmake 或其他工具交叉编译时,你需要添加-DANDROID_PLATFORM=android-21
[just only gt android-9]
你可以用 cmake 试试这个命令
# on you project_root
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=/cross/github/jni/android-ndk-r14b/build/cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN=clang -DANDROID_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DANDROID_PLATFORM=android-21 ..