jiajunhui / PlayerBase

The basic library of Android player will process complex business components. The access is simple。Android播放器基础库,专注于播放视图组件的高复用性和组件间的低耦合,轻松处理复杂业务。
Apache License 2.0
2.92k stars 437 forks source link

反射无法获取IjkPlayer #114

Closed cs9420 closed 4 years ago

cs9420 commented 4 years ago

PlayerLoader.class public static Object getDecoderInstance(int planId){ Object instance = null; try{ Class clz = getSDKClass(PlayerConfig.getPlan(planId).getClassPath()); if(clz!=null){ Constructor constructor = getConstructor(clz); if(constructor!=null){ instance = constructor.newInstance(); } } }catch (Exception e){ e.printStackTrace(); } return instance; } Class clz = getSDKClass(PlayerConfig.getPlan(planId).getClassPath()); 会抛异常 XML 里的BaseVideoView无法获得实例 inflater 抛异常 使用 ExoPlayer 没有问题

非常感谢

cs9420 commented 4 years ago

``java

public static Object getDecoderInstance(int planId){
    Object instance = null;
    try{
        Class clz = getSDKClass(PlayerConfig.getPlan(planId).getClassPath());
        if(clz!=null){
            Constructor constructor = getConstructor(clz);
            if(constructor!=null){
                instance = constructor.newInstance();
            }
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return instance;
}````
jiajunhui commented 4 years ago

这个很大可能是因为ijkplayer内部加载解码库时抛出了异常造成反射实例化失败,请注意logcat中的日志。

cs9420 commented 4 years ago

这个很大可能是因为ijkplayer内部加载解码库时抛出了异常造成反射​​实例化失败,请注意。

IjkMediaPlayer.class

    public static void loadLibrariesOnce(IjkLibLoader libLoader) {
        Class var1 = IjkMediaPlayer.class;
        synchronized(IjkMediaPlayer.class) {
            if (!mIsLibLoaded) {
                if (libLoader == null) {
                    libLoader = sLocalLibLoader;
                }

                libLoader.loadLibrary("ijkffmpeg");
                libLoader.loadLibrary("ijksdl");
                libLoader.loadLibrary("ijkplayer");
                mIsLibLoaded = true;
            }

        }
    }

这三个解码文件的确是没有加载成功,但是反复看了demo和引入没发现是哪块的问题,可否点拨一下

libLoader.loadLibrary("ijkffmpeg");
libLoader.loadLibrary("ijksdl");
libLoader.loadLibrary("ijkplayer");

引用了这三个文件

implementation project(':exoplayer')
implementation project(':ijkplayer')
api project(':playerbase')
jiajunhui commented 4 years ago

你的so库呢? 对so库的引入,以下方式二选一: 1. //ijk官方的解码库依赖,较少格式版本且不支持HTTPS。 implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' 2. 本地so文件 如果引入的有so,ijkplayer依然实例化失败,则需要确认下so的位置或者是否配置了abiFilter引起的。

cs9420 commented 4 years ago

你的so库呢? 对so库的引入,以下方式二选一: 1. //ijk官方的解码库依赖,较少格式版本且不支持HTTPS。 implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' 2. 本地so文件 如果引入的有so,ijkplayer依然实例化失败,则需要确认下so的位置或者是否配置了abiFilter引起的。

问题找到了,因为so文件只有armeabi-v7a,所以有其他比如arm64-v8a,armeabi等CPU支持的so文件,加载的时候就只会加载一种,如果手机CPU加载的是arm64-v8a支持的so文件,IjkPlayer就会找不着文件,我想咨询一下,怎么可以获取其他CPU支持的so文件呢

jiajunhui commented 4 years ago

如果是本地引入的就使用我之前编译好的全平台so文件 链接: https://pan.baidu.com/s/17SNkfY-iEa9f-GeC8Jz_uQ 提取码: gbrw 如果是远程引入的,使用ijk官方依赖,如下: implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'

cs9420 commented 4 years ago

如果是本地引入的就使用我之前编译好的全平台so文件 链接: https://pan.baidu.com/s/17SNkfY-iEa9f-GeC8Jz_uQ 提取码: gbrw 如果是远程引入的,使用ijk官方依赖,如下: implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'

非常感谢

xiaobaDev commented 4 years ago

如果是本地引入的就使用我之前编译好的全平台so文件 链接: https://pan.baidu.com/s/17SNkfY-iEa9f-GeC8Jz_uQ 提取码: gbrw 如果是远程引入的,使用ijk官方依赖,如下: implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'

分享过期了啊

Destroyer716 commented 2 years ago

如果是本地引入的就使用我之前编译好的全平台so文件 链接: https://pan.baidu.com/s/17SNkfY-iEa9f-GeC8Jz_uQ 提取码: gbrw 如果是远程引入的,使用ijk官方依赖,如下: implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8' 分享过期了,能否再分享一下