求助:Xamarin加载libtbb.so时运行时提示"libc.so未找到"
解决Android API21设备加载libtbb.so时"libc.so未找到"的问题
嘿,针对你在Windows上用Xamarin.Forms开发、在Android 6(armeabi-v7a,目标API21)设备上遇到的libc.so未找到错误,我整理了几个针对性的解决方案,应该能帮你搞定:
1. 给TBB构建明确指定目标API级别
你之前的构建命令大概率没指定目标Android API版本,导致TBB默认用了更高版本的API编译,而这些版本依赖的libc符号在API21设备上压根不存在。修改你的NDK构建命令,加上target_api=21参数:
ndk-build target=android tbb tbb_os=windows target_api=21 arch=armeabi-v7a
这样TBB会严格按照API21的标准编译,不会引入高版本libc的依赖。
2. 用兼容旧API的NDK版本
API21是比较老的Android版本了,建议你用NDK r16b到r21e之间的版本——这些版本对旧API的支持更完善。新一点的NDK(比如r22及以上)默认砍掉了对API21的部分兼容,很容易导致链接时依赖不存在的libc符号。
3. 改成静态链接TBB库
动态链接libtbb.so时特别容易踩系统库依赖的坑,换成静态链接就能绕开这个问题:
- 打开你原生库的
Android.mk,把原来的动态链接配置换成静态链接:
# 替换掉原来的动态链接行 # LOCAL_SHARED_LIBRARIES += tbb # 改成静态链接 LOCAL_STATIC_LIBRARIES += tbb
- 重新构建TBB时,确认
libs/armeabi-v7a目录下生成了libtbb.a静态库(默认NDK构建TBB会同时生成静态和动态库,一般都有)
4. 检查Application.mk的配置是否正确
确保你的Application.mk里指定了正确的ABI和目标API,还有合适的STL选项:
APP_ABI := armeabi-v7a APP_PLATFORM := android-21 APP_STL := c++_static # 用静态STL能减少对系统库的依赖,避免libc相关问题
如果之前用的是c++_shared,换成c++_static也能降低依赖冲突的概率。
5. 验证libtbb.so的依赖项
你可以用NDK自带的readelf工具检查libtbb.so的依赖,确认是不是真的依赖了不存在的libc符号:
# 找到你NDK路径下的readelf,比如在toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin里 arm-linux-androideabi-readelf -d libs/armeabi-v7a/libtbb.so | grep NEEDED
如果输出里有高版本的libc相关依赖,那肯定是构建时API级别没设对,回到步骤1重新构建就行。
内容的提问来源于stack exchange,提问作者KennnyCZ
相关产品推荐
相关产品推荐

