NDK编译的ffmpeg 库,在android上使用,提示动态库错误:
15:08:54.276 18357 18357 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libclang_rt.ubsan_standalone-aarch64-android.so" not found
在配置编译ffmpeg的时候去掉配置:--toolchain=clang-usan 分析: 1.0关于这个toochain=clang-usan 是个什么配置,有何用?
首先在configure 脚本里面搜罗了一遍: --toolchain=NAME ? ? ? ? set tool defaults according to NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ?(gcc-asan, clang-asan, gcc-msan, clang-msan, ? ? ? ? ? ? ? ? ? ? ? ? ? ?gcc-tsan, clang-tsan, gcc-usan, clang-usan, ? ? ? ? ? ? ? ? ? ? ? ? ? ?valgrind-massif, valgrind-memcheck, ? ? ? ? ? ? ? ? ? ? ? ? ? ?msvc, icl, gcov, llvm-cov, hardened) 没什么有用的信息。接着百度下?libclang_rt.ubsan_standalone-aarch64-android.so 这个库,看有何说明,也没什么发现,看看这个库的名称,关键是 clang_rt.ubsan, 接着找 ubsan关键字,还是没什么发现,科学上网谷歌了一波,不得不说这些系统、软件、语言等玩意儿毕竟都是人家搞出来的,搜出来就是直接啊,直达官方说明:
https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html ?clang 的官方文档介绍,UBSan? 全称:UndefinedBehaviorSanitizer 顾名思义 就是一个调试用的工具,类似于gdb? 配合-g参数。在添加了这个配置之后编译出来的库体积非常大,比如我编译出来的ffmpeg? ?libavcodec.a 竟然达到了300M. 当然,我们去掉这个配置不使用该工具即可,只是debug工具的话,对功能没有影响,去掉该配置之后编译出来的库大小才正常
?2.0 解决方法
最直接的就是去掉对这个库的依赖,也就是去掉这个配置?--toolchain=**, 如果真的需要使用这个工具,可以让我们编译出来的库 编译阶段就打包进来这个库,在ndk编译环境中中可以找到这个库的
并且在android手机上也确实存在这个so库: ??只是 android对 应用层加载系统库有名单限制, 白名单在系统的:/etc/public.libraries.txt
如果有root权限,可以手动修改机器上的这个文件,添加上libclang_rt.ubsan_standalone-aarch64-android.so,这样就可以加载该库了。 关于android设备上的这个白名单文件, ?See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
|