Android之解决java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations

1、问题

项目导入别人的so,有个项目没问题,但是这个有问题,运行提示这个错误

java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations



2、临时规避的解决办法

把现在的项目targetSdkVersion版本降低: such as,又24变为22,这样可以解决问题(没有源代码的情况下)

android:targetSdkVersion="22"

6.0之前只会产生一个警告,系统还是可以正常加载包含text relocations的共享库的,但从6.0起,即SDK Version>=23时,系统将会拒绝加载包含text relocations的共享库,同时输出错误Log,根本原因,是so动态链接库的代码并非PIC(Position independent code)

最好的办法是去修复源代码然后编译,我们这里调用别人的so,没办法了,如果是自己的so,在使用NDK编译so时配置Android.mk,增添PIC相关的配置项,这样编译出来的so文件将不再有text relocations的问题。具体配置如下:

LOCAL_LDFLAGS += -fPIC


3、如何定位so有问题

定位哪个so文件有text relocations问题,如下命令。

readelf -a path/to/yourlib.so | grep TEXTREL

不正常的:

readelf -a 2.so | grep TEXTREL
 0x00000016 (TEXTREL)                  0x0

只要有这个就不正常

0x00000016 (TEXTREL)                    0x0

你可能感兴趣的:(Andriod,积累)