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

相关推荐
Mr YiRan5 小时前
网络请求API监控与网络切换埋点
android·网络
美狐美颜sdk8 小时前
直播APP开发技术栈详解:视频美颜SDK、人脸识别与实时渲染
android·人工智能·音视频·美颜sdk·直播美颜sdk
奈斯先生Vector14 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
TimeFine14 小时前
让强模型做“总工”,让高性价比模型写代码
android
又见情义15 小时前
RK3568 Android 13 屏蔽 healthd 电池日志经验分享
android
古法安卓19 小时前
Android-Fork 机制详解
android·java·android studio
Android打工仔19 小时前
不要在 Data 层随意把 Cold Flow 转换成 Hot Flow
android·架构·kotlin
峥嵘life19 小时前
2026免费的 opencode 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言
杉氧20 小时前
拒绝重复造轮子:我写了一个生产级的 Kotlin 协程与 Flow 工具库(CoroutineKit)
android·kotlin·workflow
恋猫de小郭20 小时前
Flutter GSoC 2026 提案进度解读,补上 DevTools、FFI 和原生平台的关键缺口
android·前端·flutter