AndroidStudio 多个第三方so文件重复引用导致 java.lang.UnsatisfiedLinkError 问题

最近在做直播项目,说说我这几天查资料得到的结果,直播大概分三个麻烦的地方,推流,拉流,聊天室;
最简单的方式就是使用一个第三方的服务商,使用它们的配套sdk(直播神马的 辣鸡。。。)
最复杂的便是全都自己写(在这个开源时代,说说就好了。。。)
由于我在的厂有点奇葩····(自己搭了推流服务器~~好吧,老大你赢了!)
所以我选择这么做:

推流

我选择用的是百度的推流sdk(免费,文档详细···)

拉流

拉流其实就是播放,使用bilibili开源的 ijkplayer播放器 这个播放器是基于 FFmpeg (这个项目基本上是现在直播这边的始祖了~)

聊天室

这块打算用腾讯云或者网易云信(主要看老大意思,要是他选择自己塔服务器我也没辙~~!)

ijkplayer集成

     //    # required, enough for most devices.
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.7.5'
    compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.7.5'
    //    # Other ABIs: optional
    compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.7.5'
    //    compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.7.5' 最低支持21
    compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.7.5'
    //    compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.7.5' 最低支持21 
    //    # ExoPlayer as IMediaPlayer: optional, experimental
    compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.7.5'

百度推流SDK

下载百度推流的SDK,然后导入so和lib,再加载jni

  sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir 'src/main/libs'
    }

    task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
        destinationDir file("$projectDir/libs")
        baseName "Native_Libs2"
        extension "jar"
        from fileTree(dir: "libs", include: "**/*.so")
        into "lib"
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }

一切看起来很美好,但是:
AndroidStudio 多个第三方so文件重复引用导致 java.lang.UnsatisfiedLinkError 问题_第1张图片

开始明明好好的,一加载了百度推流的SDK就出毛病了!!!
提示也很奇怪,找不到 xxx.so 文件,首先想到的是不是引用了重复的so,然后去网上查ijkplayer加载so的方法,发现他的so是动态加载的(具体可以看 这里)这种引入的方式导致我们无法对 ijkplayer 的so进行操作(其实ijkplayer 网上有人家编译好的so,这里我就没做尝试了。。。) 后来在 这里 找到了问题关键
做法就很简单了:
在app的build.gradlede 中的 defaultConfig{}里面加上

  ndk{
            moduleName "libFaceSDK.so"  //设置库(so)文件名称
            moduleName "libfaceu-library.so"  //设置库(so)文件名称
            moduleName "libffmpeg.so"  //设置库(so)文件名称
            moduleName "libidl_license.so"  //设置库(so)文件名称
            moduleName "libidl_token.so"  //设置库(so)文件名称
            moduleName "librecorder.so"  //设置库(so)文件名称
            moduleName "librtmp_jni.so"  //设置库(so)文件名称
            ldLibs "log"
            abiFilters  "armeabi-v7a", "x86_64"
        }

到此就ok了。

你可能感兴趣的:(Android,开发随笔)