Android设备频繁崩溃:找不到libavutil.so库问题求助
问题背景
设备出现大量崩溃,报错信息:
Fatal Exception: java.lang.UnsatisfiedLinkError dlopen failed: library "libavutil.so" not found
现有配置:
- 初始化代码:
init { try{ System.loadLibrary("avutil") System.loadLibrary("avcodec") System.loadLibrary("avformat") System.loadLibrary("swscale") System.loadLibrary("avfilter") } catch (e:Exception){ Log.i("error","${e.message}") } }
- app/build.gradle中的NDK配置:
ndk { abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64' }
解决方案
检查.so文件存放路径
确认libavutil.so等库文件是否放在src/main/jniLibs/对应ABI子目录下(如src/main/jniLibs/armeabi-v7a/libavutil.so),每个在abiFilters中声明的ABI目录都必须有完整的对应库文件,不能缺失。若通过CMake/ndk-build编译生成库,需确保编译脚本将产物输出到对应目录,且gradle正确引入该路径。补全gradle路径配置
若自定义了.so文件存放目录(如libs/),需在android块中添加路径映射:sourceSets { main { jniLibs.srcDirs = ['libs'] // 根据实际路径调整 } }同时确认abiFilters的声明与实际提供的.so文件ABI完全匹配,避免出现配置了x86但无对应库文件的情况。
优化异常排查与加载顺序
FFmpeg库存在依赖关系,当前加载顺序(avutil→avcodec→avformat等)是正确的,但需确认是否遗漏隐式依赖库(如部分FFmpeg版本需加载swresample)。另外修改catch块打印完整异常栈,获取更多错误细节:catch (e: Exception) { Log.e("FFmpegLoadError", "加载失败", e) }检查打包完整性
执行./gradlew assembleDebug后,查看app/build/intermediates/merged_jni_libs/debug/out/lib目录,确认所有指定ABI下的libavutil.so都存在。若缺失,排查库文件来源是否正确,是否在打包过程中被过滤。适配Android 12+限制
Android 12及以上版本对动态库加载有严格限制,需在buildTypes块中添加配置避免库文件被压缩:buildTypes { release { packagingOptions { doNotStrip "*/armeabi-v7a/*.so" doNotStrip "*/arm64-v8a/*.so" doNotStrip "*/x86/*.so" doNotStrip "*/x86_64/*.so" } } debug { packagingOptions { doNotStrip "*/armeabi-v7a/*.so" doNotStrip "*/arm64-v8a/*.so" doNotStrip "*/x86/*.so" doNotStrip "*/x86_64/*.so" } } }
内容的提问来源于stack exchange,提问作者sejn

