jni 在 android 6 上 cannot locate
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
Libraries missing DT_SONAME · Issue #188 · bytedeco/javacpp-presets · GitHub