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

相关推荐
Dnelic-1 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen3 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年10 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿13 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神14 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛14 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法15 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter16 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快17 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl17 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5