Android P vendor三方模块dlopen failed: library "libstdc++.so" not found, 失败问题分析

12-21 17:47:30.305 4365 4365 E CamX : [ERROR][UTILS ] camxosutilslinux.cpp:874 LibMap() dlopen: dlopen failed: library “libstdc++.so” not found, on ‘/vendor/lib64/camera/components/com.**.so’

现象: 在高通平台上一直三方算法时三方库需要用到 libstdc++.so ,因为在vendor/{lib}中没有找到改so库,报了如上错误,就会导致在createpipe 中的createnode时失败,
原因: libstdc++.so 没有找到,
解决方案: Android O项目,在相关的Android.mk文件中在LOCAL_SHARED_LIBRARIES := 中添加上libstdc++ 即可链接该库编译.

Android P项目,Android 项目找上诉添加会有如下报错:
vendor/node/***/build/android/Android.mk: error: com.***.node.***(native:vendor) should not link to libstdc++ (native:platform)
原因时Android的LL-VNDK 为了降低vendor和框架的耦合度,删除了libstdc++库,此时不能采用编译添加库的方法去fix此问题,
vendor程序在运行时会根据相关setting先去在vendor/{lib},如果没有找到回去遍历其他我们配置的lib path,因为上述libstdc++是在system/{lib}中的,我们就需要添加此path供程序运行时查找,
添加方法:
在system/core/rootdir/etc/ld.config.txt文件中,在[vendor]子项中添加如下:
namespace.default.search.paths += /system/${LIB}
此处还有其他的namespace, 如 vndk, sphal等,如果设置default没有生效,则上述的相关namespace都配置下,然后采用排除法,确定是哪个namespace能解决问题.

Android P的vndk(供应商开发套件)是为了降低vendor和platform的耦合度,方便后续坐系统升级时不用改动vendor而直接更改system即可,不确定上述修改可能会带来的其他风险,但自我评估风险不大,因为vendor里面的程序运行时会先去遍历vendor/{lib}没有找到才会去遍历其他库.

关于vndk的详细介绍可参考: https://source.android.com/devices/architecture/vndk ,如果各位就此问题有更好的解决方法,欢迎沟通.
如有错漏,欢迎斧正,十分感谢.

++++++++++
此修改方案会导致cts, vts测试fail, 建议解决方法是找算法供应商更改,不要使用libstdc++,
另外可以先copy一份libstdc++.so文件到vendor目录下,再在device.mk 文件中添加如下代码行, 则可以在编译时把libstdc++.so打包到vendor.img中
PRODUCT_COPY_FILES += vendor/mediatek/proprietary/hardware/mtkcam/**/libstac++.so:$(TARGET_COPY_OUT_VENDOR)/lib/libstac++.so

你可能感兴趣的:(一切都是最好的安排)