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库。

相关推荐
氦客21 分钟前
Android Compose : 仿IOS风格BottomSheet关闭效果:滑动到顶部,再次滑动才关闭
android·compose·bottomsheet·仿ios风格·底部弹框·滑动到顶部·再次滑动才关闭
COSMOS_*9 小时前
2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)
android·ide·jdk·gitee·android studio
jian110589 小时前
android studio Profiler性能优化,查看内存泄漏
android·性能优化·android studio
建群新人小猿11 小时前
陀螺匠企业助手——组织框架图
android·java·大数据·开发语言·容器
TheNextByte112 小时前
如何将文件从Android无线传输到 iPad
android·ios·ipad
赫萝的红苹果12 小时前
实验探究并验证MySQL innoDB中的各种锁机制及作用范围
android·数据库·mysql
叶落无痕5213 小时前
Android Studio 2024.3.1 连接夜神模拟器
android·ide·android studio
玲子的猫13 小时前
安卓原生开发实现图片双指放大预览功能
android
2501_9151063214 小时前
如何在iPad上高效管理本地文件的完整指南
android·ios·小程序·uni-app·iphone·webview·ipad
似霰14 小时前
AIDL Hal 开发笔记5----实现AIDL HAL
android·framework·hal