jni之动态库的加载
一项目中,使用了多个动态库,且动态库之间存在依赖关系,假设为a.so及b.so,且b.so依赖于a.so。
在使用
static { System.load(“a.so”); System.load(“b.so”); }
进行动态库加载的时候,始终提示b库加载失败,称找不到依赖a,但是显然第一部就加载了a,且加载成功。
几经周折发现,a的SONAME不为a,而是"_a"。加载过程中,系统分析动态库的依赖关系不是基于文件名而是SONAME。
总结:使用“readelf”命令可以查看so库的SONAME及依赖关系;使用“patchelf”命令可以修改动态库的a的SONAME,也可以修改b的依赖信息为_a.so。