Androids中的System.loadLibrary对于依赖so的加载分析

        Android虽然基于Linux系统,但Android本身做了大量的修改。其中对于系统C库更是自己重新实现——Bionic库。在源码目录构中bionic可以找到相关内容。话题好像偏离有点远,但System.loadLibrary最终还是调用到bionic库中的函数dlopen。这个dlopen搜索依赖so的路径与Linux本身有着不一样的实现,并且在4.2.2版本及以下有着无法隐式加载app目录下依赖so的缺陷,直到4.3才被修复。

        关于System.loadLibrary和System.load两个在java中加载so的方法,已经有人进行个大致的分析(Java中System.loadLibrary() 的执行过程  文章中的分析内容是4.2.2版本,仍然不支持隐式加载app目录下依赖so),可以先看看这篇文章里关于以上两个java函数的实现,了解大部分的流程。然后,这里就要开始从dlopen开始分析,对于依赖so加载的问题。


具体分析

        首先来看这样一个例子,有两个so,liba.so、libb.so。其中,liba.so引用了libb.so导出的符号,并且是直接引用符号,也就是

需要加载器在运行时的动态隐式链接。在加载liba.so的时候,Java层里,我们会调用System.loadLibrary(),或者System.load()来

指定so的路径,然后最终会调用到native代码中,使用dlopen加载liba.so,就会根据liba.so的Dynamic section中列出类型为

DT_NEEDED的依赖共享库so,并且会递归地一个一个地加载依赖so。在LInux下,加载这些依赖so的路径会是 1. 环境变量LD_LIBRARY指明的路径。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
06-12 16:01:50.335 25052 25443 D MediaCodec-java: start --start 06-12 16:01:50.338 25052 25443 D MediaCodec-java: Current process == com.ktcp.video 06-12 16:01:50.339 25052 25443 I com.ktcp.video: Rejecting re-init on previously-failed class java.lang.Class<com.skydebug.ftrace.FtraceSys>: java.lang.UnsatisfiedLinkError: dlopen failed: library "libskytrace.so" not found 06-12 16:01:50.339 25052 25443 I com.ktcp.video: (Throwable with no stack trace) 06-12 16:01:50.340 25052 25443 W System.err: java.lang.NoClassDefFoundError: com.skydebug.ftrace.FtraceSys 06-12 16:01:50.340 25052 25443 W System.err: at android.media.MediaCodec.setSkyMediaStatus(MediaCodec.java:2023) 06-12 16:01:50.340 25052 25443 W System.err: at android.media.MediaCodec.start(MediaCodec.java:2331) 06-12 16:01:50.340 25052 25443 W System.err: at com.tencent.thumbplayer.core.codec.tmediacodec.codec.DirectCodecWrapper.start(DirectCodecWrapper.java:82) 06-12 16:01:50.340 25052 25443 W System.err: at com.tencent.thumbplayer.core.codec.tmediacodec.TMediaCodec.start(TMediaCodec.java:136) 06-12 16:01:50.340 25052 25443 W System.err: at com.tencent.thumbplayer.core.codec.decoder.TPBaseMediaCodecDecoder.initMediaCodecInternal(TPBaseMediaCodecDecoder.java:317) 06-12 16:01:50.340 25052 25443 W System.err: at com.tencent.thumbplayer.core.codec.decoder.TPBaseMediaCodecDecoder.startDecoder(TPBaseMediaCodecDecoder.java:349) 06-12 16:01:50.340 25052 25443 W System.err: at com.tencent.thumbplayer.core.codec.decoder.TPMediaCodecManager.initVideoMediaCodec(TPMediaCodecManager.java:112) 06-12 16:01:50.340 25052 25443 W System.err: Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "libskytrace.so" not found 06-12 16:01:50.340 25052 25443 W System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1088) 06-12 16:01:50.340 25052 25443 W System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:998) 06-12 16:01:50.340 25052 25443 W System.err: at java.lang.System.loadLibrary(System.java:1656) 06-12 16:01:50.340 25052 25443 W System.err: at com.skydebug.ftrace.FtraceSys.<clinit>(FtraceSys.java:25) 06-12 16:01:50.340 25052 25443 W System.err: at com.skydebug.ftrace.FtraceSys.PointWriteFile(FtraceSys.java:73) 06-12 16:01:50.340 25052 25443 W System.err: ... 7 more
06-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值