ijkplayer -- Android编译64位so文件

目录

  • 前言
  • [1. ijkplayer-java:0.8.0](#1. ijkplayer-java:0.8.0)
  • [2. 64位手机上,IMediaPlayer.prepareAsync()闪退](#2. 64位手机上,IMediaPlayer.prepareAsync()闪退)

前言

IjkPlayer是B站开源的播放器,可以支持本地播放,视频直播等功能。

GitHub地址:https://github.com/Bilibili/ijkplayer

感兴趣的小伙伴可以到GitHub上研究下源码,上面也记录了使用方法。

这里不讲IjkPlayer的使用方法,网上有很多资料可查询,请自行查找。

这里只记录在替换 ijkplayer-java:0.8.0 版本的64位so文件时遇到的问题。

1. ijkplayer-java:0.8.0

公司有个老项目接入了IjkPlayer 0.8.0 版本,当时导入的so文件只有:armeabi、armeabi-v7a、mips、x86:



build.gradle(app)文件里设置支持的SO库架构

java 复制代码
defaultConfig {
     ........
     ndk {
         //设置支持的SO库架构
         abiFilters "armeabi", "armeabi-v7a", "mips", "x86"
                 //"x86_64"
     }
     ........
}

由于apk要上架到各大平台应用市场上,而应用市场要求上传的apk必须要适配64位的手机,否则不予上传,而当时接入的IjkPlayer 0.8.0并没有适配64位的so文件(接入的比较早,当时还没有64位手机的说法)。

所以接下来就去探索如何产生IjkPlayer 0.8.0 版本64位的so文件。

一开始想到的是下载IjkPlayer 0.8.0的源码,自行编译产生64位的so文件。于是在GitHub上下载了0.8.0版本的源码,GitHub上也记录了如何编译so文件的方法,同时在网上查阅了其它相关资料。折腾一圈发现,编译so文件的条件太苛刻:Mac环境、安装NDK、Linux系统上编译so库,看到这些就被劝退了。

IjkPlayer编译so 的一些学习资料,可供参考:
Mac m2芯片 全量编译ijkplayer生成Android库
【错误记录】编译 Android 版本的 ijkplayer 报错 ( You must define ANDROID_NDK before starting. | 下载指定版本 NDK )
Android IjkPlayer内核编译记(一)so库编译&使用

随后我在网上查找是否有已经编译好的 IjkPlayer 0.8.0 64位的so文件,终于让我找到了:

同时修改项目中的build.gradle,引入"tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.0"

java 复制代码
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.0'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.0'

并将 build.gradle(app)文件里设置支持的SO库架构代码去掉。

虽然arm64-v8a文件夹和armeabi、armeabi-v7a、mips、x86文件夹下的so文件名字不一样,但是确实能用(亲测)。

IjkPlayer 0.8.0 64位的so文件已上传,有需要的小伙伴自行下载。

2. 64位手机上,IMediaPlayer.prepareAsync()闪退

应用上架后,部分用户反馈64位手机看视频闪退。

问题分析:

经排查,该崩溃问题是安卓11对64位库的指针访问问题导致的。

原因:从安卓11开始,对于64位进程,进行加指针标记的功能,此功能意味着在访问内存时会忽略指针的顶部字节。这样的原因会导致播放器内核(ijkplayer)在播放网络视频的时候产生播放崩溃。

在工程的 AndroidManifest.xml 文件中添加以下内容:

java 复制代码
<application 
    android:allowNativeHeapPointerTagging="false">
...
</application>

这将为应用停用指针标记功能,从而临时解决该问题。(已验证成功)

或者同步升级和更新sdk底层库使用的 ffmpeg和ijkplayer 到目前开源版本的最新代码,并同步更新主工程使用的sdk库。

相关推荐
双桥wow9 分钟前
Android Framework开机动画开发
android
fanged7 小时前
天马G前端的使用
android·游戏
molong93111 小时前
Kotlin 内联函数、高阶函数、扩展函数
android·开发语言·kotlin
叶辞树12 小时前
Android framework调试和AMS等服务调试
android
慕伏白14 小时前
【慕伏白】Android Studio 无线调试配置
android·ide·android studio
低调小一15 小时前
Kuikly 小白拆解系列 · 第1篇|两棵树直调(Kotlin 构建与原生承载)
android·开发语言·kotlin
跟着珅聪学java15 小时前
spring boot 整合 activiti 教程
android·java·spring
川石课堂软件测试16 小时前
全链路Controller压测负载均衡
android·运维·开发语言·python·mysql·adb·负载均衡
2501_9159214317 小时前
iOS 26 电耗监测与优化,耗电问题实战 + 多工具 辅助策略
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_9159214317 小时前
苹果软件混淆与 iOS 应用加固白皮书,IPA 文件加密、反编译防护与无源码混淆方案全解析
android·ios·小程序·https·uni-app·iphone·webview