Android P(9.0)及Marshmallow初始化FFmpegFrameRecorder崩溃求助
从你提供的LogCat日志能明确看到,崩溃的核心原因是无法找到libjniavutil.so本地库,进而引发java.lang.UnsatisfiedLinkError,最终导致org.bytedeco.javacpp.avutil类加载失败,初始化FFmpegFrameRecorder时崩溃。针对Android 9.0(Pie)和Marshmallow的这个问题,你可以按以下步骤排查解决:
1. 确认JavaCV/FFmpeg依赖配置正确性
首先要确保你引入的是适配Android平台的JavaCV依赖,推荐使用带-android后缀的完整平台包,或者针对性引入对应CPU架构的FFmpeg库:
- 如果你用的是Gradle,建议使用:
或者单独引入对应架构的库(比如你的设备是arm64-v8a):implementation 'org.bytedeco:javacv-platform:1.5.8-android' // 替换为你使用的版本,注意版本要统一
务必保证javacv和ffmpeg的版本号完全对应,不匹配的版本很容易导致库加载失败。implementation 'org.bytedeco:javacv:1.5.8' implementation 'org.bytedeco:ffmpeg:5.1.2-1.5.8-android-arm64' // 版本要和javacv匹配
2. 配置正确的ABI过滤
在你的app模块的build.gradle中,明确指定支持的CPU架构,确保包含日志中显示的arm64-v8a:
android { defaultConfig { ndk { abiFilters 'arm64-v8a', 'armeabi-v7a' // 根据你的目标设备调整,至少包含arm64-v8a } } }
这个配置能避免Gradle打包不必要的ABI库,同时确保需要的架构库被正确打包到APK中。
3. 验证APK中的本地库是否存在
打包APK后,解压查看lib/arm64-v8a目录下是否存在libjniavutil.so、libjniavcodec.so等JavaCV相关的.so文件。如果缺失,说明依赖引入过程有问题,需要重新检查Gradle依赖配置,或者尝试清理缓存后重新构建(执行./gradlew clean build)。
4. 手动提前加载本地库(针对Android 9.0)
Android 9.0对动态库加载有更严格的限制,你可以尝试在Application类的onCreate方法中提前手动加载依赖的本地库:
@Override public void onCreate() { super.onCreate(); try { System.loadLibrary("avutil"); System.loadLibrary("avcodec"); System.loadLibrary("avformat"); System.loadLibrary("swscale"); // 按依赖顺序加载,avutil是基础,必须先加载 } catch (UnsatisfiedLinkError e) { Log.e("YourApp", "Failed to load native libraries", e); } }
这样可以避免FFmpegFrameRecorder初始化时动态加载库出错。
5. 检查混淆配置(如果开启了混淆)
如果你的项目开启了代码混淆,一定要在proguard-rules.pro中添加规则,确保JavaCV相关类不被混淆:
-keep class org.bytedeco.** { *; } -keep class org.bytedeco.javacpp.** { *; } -keep class org.bytedeco.javacv.** { *; } -dontwarn org.bytedeco.**
混淆会破坏JavaCV的类结构,导致类找不到或方法调用失败。
按照以上步骤逐一排查,应该能解决初始化FFmpegFrameRecorder时的崩溃问题。
内容的提问来源于stack exchange,提问作者Dharmik Ghori

