AndroidStudio 多个第三方so文件重复引用导致 java.lang.UnsatisfiedLinkError 问题
2016-12-12 17:21
597 查看
最近在做直播项目,说说我这几天查资料得到的结果,直播大概分三个麻烦的地方,推流,拉流,聊天室;
最简单的方式就是使用一个第三方的服务商,使用它们的配套sdk(直播神马的 辣鸡。。。)
最复杂的便是全都自己写(在这个开源时代,说说就好了。。。)
由于我在的厂有点奇葩····(自己搭了推流服务器~~好吧,老大你赢了!)
所以我选择这么做:
一切看起来很美好,但是:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/c29e85d00fe6e622191a0a0e4b5cde51)
开始明明好好的,一加载了百度推流的SDK就出毛病了!!!
提示也很奇怪,找不到 xxx.so 文件,首先想到的是不是引用了重复的so,然后去网上查ijkplayer加载so的方法,发现他的so是动态加载的(具体可以看 这里)这种引入的方式导致我们无法对 ijkplayer 的so进行操作(其实ijkplayer 网上有人家编译好的so,这里我就没做尝试了。。。) 后来在 这里 找到了问题关键
做法就很简单了:
在app的build.gradlede 中的 defaultConfig{}里面加上
到此就ok了。
最简单的方式就是使用一个第三方的服务商,使用它们的配套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,再加载jnisourceSets.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) }
一切看起来很美好,但是:
开始明明好好的,一加载了百度推流的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了。
相关文章推荐
- AndroidStudio 关于第三方so文件不全导致java.lang.UnsatisfiedLinkError解决办法
- java 问题 无法解析类型 java.lang.CharSequence。从必需的 .class 文件间接引用了它
- 遇到问题---java---myeclipse中maven项目引用另一个导致的resource文件混乱的问题
- JQuery文件重复引用问题导致某些函数调用时出现undefined
- 遇到问题---java---myeclipse中maven项目引用另一个导致的resource文件混乱的问题
- 问题007:JDK版本与JRE版本不同导致java.exe执行类文件错误 java.lang.UnsupportedClassVersionError错误
- 无法解析类型 java.lang.Object。从必需的 .class 文件间接引用了它
- Android引用百度定位API第三方组件后导致其它.so文件无法正常加载的问题
- 问题分析-无界线程池误用导致OOM:java.lang.OutOfMemoryError:unable to create new native thread
- 无法解析类型 java.lang.Object。从必需的 .class 文件间接引用了它
- 问题一20150509——mybatis的配置文件useGeneratedKeys属性(报java.lang.ArrayIndexOutOfBoundsException)
- c#扩展SPRING,配置里有不存在的业务系统xml导致不能启动问题,把配置文件里有重复的服务ID找出来并写入到日志
- FreeMarker的FTL页面中include引用UTF-8文件导致错位的问题处理
- FreeMarker的FTL页面中include引用UTF-8文件导致错位的问题处理
- Android Studio运行项目报错:java.lang.UnsatisfiedLinkError——.so文件问题
- Android/Java项目中重复引用jar包导致的错误
- Eclipse下好使,但是cmd下执行java运行class文件提示Exception in thread "main" java.lang.NoClassDefFoundError问题
- 导致java.lang.OutOfMemoryError 问题的原因以及处理方式
- Eclipse下好使,但是cmd下执行java运行class文件提示Exception in thread "main" java.lang.NoClassDefFoundError问题
- Android中引用jar,提示java.lang.NoClassDefFoundError问题解决