java – 在Android应用程序中为HttpClient更改OpenSSL库
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在Android应用程序中为HttpClient更改OpenSSL库,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1992字,纯文字阅读大概需要3分钟。
内容图文
我需要在我的项目中为HttpClient使用自定义OpenSSL库.
我为Android编译了libcrypto.so和libssl.so,并将文件放在jniLibs文件夹中.应用Heartbleed扫描仪看到它们. System.loadLibrary(“crypto”)和System.loadLibrary(“ssl”)有效.
但是现在我需要让HttpClient使用我的库而不是标准的SSL库.但我不知道哪种方式移动以及如何移动.
我使用的是OpenSSL 1.0.1h和Android Studio 1.0.2.
提前感谢您的建议.
解决方法:
I have compiled libcrypto.so and libssl.so for Android and put the files in a folder jniLibs…
这不行.
Android使用OpenSSL 1.0.0并在/ system中提供. Zygote在启动时启动并加载OpenSSL的低级版本(它类似于init – 所有Android进程都是从它分叉的).
当您的进程从Zygote分叉时,您的1.0.1版本永远不会加载,因为已经从Zygote加载了1.0.0.你永远不会知道有问题,因为低级版本提供了你需要的所有符号(它的二进制兼容).
您需要编写包装器共享对象.包装器共享对象必须链接到OpenSSL 1.0.1的静态版本(libcrypto.a和libssl.a).您的包装器必须导出唯一的符号,例如My_OpenSSL_add_all_algorithms和My_SSL_load_error_strings.在内部,您的共享对象可以引用未修饰的名称,OpenSSL_add_all_algorithms和SSL_load_error_strings.
所以你的共享对象看起来像这样(也见GCC的Visibility page):
#if __GNUC__ >= 4
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
#define DLL_LOCAL __attribute__ ((visibility ("hidden")))
#else
#define DLL_PUBLIC
#define DLL_LOCAL
#endif
DLL_PUBLIC void My_OpenSSL_add_all_algorithms() {
return (void)OpenSSL_add_all_algorithms();
}
DLL_PUBLIC void My_SSL_load_error_strings() {
return (void)SSL_load_error_strings();
}
...
然后,使用-fvisibility = hidden标志进行编译,并链接libcrypto.a和libssl.a.只有标有DLL_PUBLIC的函数才会通过JNI导出和调用.
我认为不需要#if __GNUC__> = 4,因为Android提供的交叉编译工具是上面的GCC 4.0.事实上,我认为它目前是GCC 4.8.
Changing OpenSSL library in Android app for HttpClient
这个问题更难了.在共享包装器中提供更新的OpenSSL后,我不知道如何使用Android的HttpClient来使用它.
更糟糕的情况回答:您可能需要分叉Android并提供更新的OpenSSL.
一个可能更好的解决方案:删除HttpClient代码,将其放在您自己的包中,然后确保源代码的端口使用共享对象.
内容总结
以上是互联网集市为您收集整理的java – 在Android应用程序中为HttpClient更改OpenSSL库全部内容,希望文章能够帮你解决java – 在Android应用程序中为HttpClient更改OpenSSL库所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。