jni 在 android 6 上 cannot locate

2016-08-06  本文已影响1008人  megar

dllopen cannot locate symbol "SSL_CTX_callback_ctrl" referenced by liblocalproxy.so

1. 刚看到这个错误挺奇怪,我们的so明明使用了静态链接,怎么会有这么奇怪的问题呢

2. 看了下出错的日志,有2处系统出错,先解决吧

5 06:09:26.042 29304 29304 W linker  : /data/app/com.example.statistics7777-2/lib/arm/liblocalproxy.so: unused DT entry: type 0xf arg 0xcdf7

就是说android linker 不支持 -rpath的链接选项,所以如果链接的时候用了这个就去掉吧,为毛在android 6之前没有这个错误。

08-05 06:09:26.042 29304 29304 W linker  : /data/app/com.example.statistics7777-2/lib/arm/liblocalproxy.so: is missing DT_SONAME will use basename as a replacement: "liblocalproxy.so"

 这个没有增加soname ,用命令看下

objdump --private-headers xxx.so |grep SONAME 

好解决,在linker的时候加上  -Wl,-soname,libXXXXX.so

3. 启动,上面2个错误不见了,还是报"SSL_CTX_callback_ctrl"找不到,我们原本的libssl libcrypto 这2个库原来是想通过

静态链接的,不应该会出现动态加载才对。查到快23点,发现原来是我们在库搜索的位置里面拷贝了 libssl.so 和 libcrypto.so ,这样导致了链接的时候系统认为是动态链接的。

root cause: 在android6 之前的版本,默认去/system/lib 下去找libssl.so 和 libcrypto.so 。但是到 6 之后,google更换了ssl的算法,使用boringssl ,/system/lib下就没有libssl.so 和 libcrypto.a 这2个库了,所以就无法启动了。

4. 修改方法:

      1) ,删除链接目录下误拷贝的libssl.so libcrypt.so ,改成静态链接。我们变出了这2个静态库

      2) , 在应用程序的armeabi目录下把 libssl.so libcrypto.so 拷贝到应用程序的这个目录下,android系统

默认会去到这个目录下去找so链接符号。

参考链接:

code.google.com/p/android/issues/detail  (https://code.google.com/p/android/issues/detail?id=191822)

Binary fails to run on OpenBSD

soname - Wikipedia

Libraries missing DT_SONAME · Issue #188 · bytedeco/javacpp-presets · GitHub

Finding a Hidden Flaw that Will Crash Apps on Android M

Android 6.0 openssl crash - 书写

上一篇下一篇

猜你喜欢

热点阅读