原文地址链接:
本条推送将提供有关构建适用于Android的设备的OpenSSL的库的说明
首先,一般的Linux上都会已经安装了的OpenSSL的,可以使用
-
openssl version -a ##命令查看当前的版本
当然,如果你是做的OpenSSL的开发,那系统默认这点肯定是不够的,下面我们开始完全安装。
一,准备
1,下载OpenSSL的,网官这里。
下载的命令这里使用的wget
wget https://www.openssl.org/source/openssl-1.0.2n.tar.gz ## 1.0.2版本
二,安装
1,解压的OpenSSL
解压命令
tar -zxvf openssl-1.0.2 n.tar.gz
可能需要加上权限
chmod -R 777 openssl-1.0.2n ##指定权限
解压后进入此目录
2,OpenSSL默认安装路径是:/ usr / local / ssl,模块类型:动态和静态加载模块,* .so * .a。
3,prefix是安装目录,openssldir是配置文件目录,另外建议安装两次,共享作用是生成动态连接库。
-
./config --prefix = / usr / local --openssldir = / usr / local / ssl
-
使
-
进行安装
-
//建议只生成动态链接库
-
./config shared --prefix = / usr / local --openssldir = / usr / local / ssl
-
使干净
-
使
-
进行安装
4,更新系统
-
vim /etc/ld.so.conf
添加在/ usr /本地/ SSL,然后运行ldconfig命令。
三,使用
如图1所示,头文件目录
-
在/ usr /本地/ SSL /包括
-
GCC编译的时候加-lssl,同时指定libssl.so。
在Android上使用OpenSSL通常涉及到JNI以及OpenSSL或BoringSSL的平台版本。在Zygote初始化期间,该平台很可能会在启动时加载系统版本的libssl.so和libcrypto.so。由于加载器和符号解析的问题,习惯的LD_LIBRARY_PATH技巧不适用于大多数应用程序。而更改构建输出不同的库名称,如libmyssl.so和libmycrypto.so,以避免冲突也无法正常工作。
空间命名符号状语从句:解析问题的解决方案的英文将静态版本的OpenSSL的封装库到由您提供的单独的动态库或共享对象中。要做到这一点,编写一个小的Ç包装库,并从OpenSSL的库中引用所需的函数。你不需要包装所有的功能。
你的wrapper.c 可能看起来如下(也参见GCC的可见性页面):
的#if __GNUC __> = 4的#define DLL_PUBLIC __attribute __((可见性(“默认”)))的#define DLL_LOCAL __attribute __((可见性(“隐藏”)))#其他的#define DLL_PUBLIC的#define DLL_LOCAL#万一DLL_PUBLIC空隙My_OpenSSL_add_all_algorithms() {return(void)OpenSSL_add_all_algorithms(); } DLL_PUBLIC无效My_SSL_load_error_strings(){返回(无效)SSL_load_error_strings(); } ...
然后,将源文件编译成共享对象。典型的命令行可能如下所示。
$ export(OPENSSL_ANDROID)/ include -fvisibility = hidden -Wl, - exclude-libs,ALL \ -Wl ,-Bstatic -lcrypto -lssl -L $(OPENSSL_ANDROID)/ lib -o wrapper.so -Wl,-Bdynamic
-fvisibility =隐藏工作正如你所期望的,轮候册, -排除,库,ALL意味着你的库不会重新导出其他链接库符号只有使用。DLL_PUBLIC标记的函数才能通过JNI导出和调用。
该-Wl ,-Bstatic告诉编译器使用OpenSSL库的静态版本的库链接。在它和-Wl 之后,-Bdynamic会告诉链接器使用动态链接来执行它可能需要的任何其他功能,如libc。
然后使用您的共享对象来代替OpenSSL的。
欢迎关注微信号:魅影响
或扫描下方二维码关注