1

Android ndk"undefined reference to pthread_atfork"在我尝试为 Android 交叉编译 libpcsclite 时告诉我

实际上我已经知道Android的仿生库(Android docs)中没有pthread_atfork函数,但是pthread_atfork必须在pcsclite库中调用。在这种情况下有什么解决办法吗?

4

3 回答 3

0

看起来直到 android-10/v2.3.6/Gingerbread 之后pthread_atfork()添加到仿生 libc中。如果您想针对旧版本的 Android,您必须在项目中包含pthread-atfork.c或更新的pthread_atfork.cpp,或者根本不使用pthread_atfork()

于 2013-12-05T16:37:12.727 回答
0

看看这个:http ://comments.gmane.org/gmane.comp.handhelds.android.ndk/15982

我相信函数 pthread_atfork 是在 Bionic 库中实现的(但是,它没有记录在案)。

我认为你所要做的就是声明它来使用它。

通常的警告:如果您使用未记录的方法,它们可能无法正常工作或将来可能会被弃用。

于 2012-09-11T13:48:19.713 回答
0
-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   ..
于 2019-09-10T10:08:13.487 回答