美文网首页
jni 在 android 6 上 cannot locate

jni 在 android 6 上 cannot locate

作者: megar | 来源:发表于2016-08-06 10:05 被阅读1008次

    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 - 书写

    相关文章

      网友评论

          本文标题:jni 在 android 6 上 cannot locate

          本文链接:https://www.haomeiwen.com/subject/nesksttx.html