在Linux系统下编译Android端使用的openssl

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meiwei_1/article/details/79194201

原文地址链接:

https://mp.weixin.qq.com/s?__biz=MzI0NDgyODEwMw==&mid=2247483726&idx=1&sn=7dfe9a83e9edde826a0e3fa3d4cdb1e7&chksm=e95693e6de211af082d5e25976699c19a8083c504222beaacfc537100a839ee471e38640bf0a#rd

本条推送将提供有关构建适用于Android的设备的OpenSSL的库的说明

首先,一般的Linux上都会已经安装了的OpenSSL的,可以使用

  1. 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是配置文件目录,另外建议安装两次,共享作用是生成动态连接库。

  1. ./config --prefix = / usr / local --openssldir = / usr / local / ssl  

  2. 使  

  3. 进行安装   

  4. //建议只生成动态链接库  

  5. ./config shared --prefix = / usr / local --openssldir = / usr / local / ssl  

  6. 使干净  

  7. 使   

  8. 进行安装  

4,更新系统

  1. vim /etc/ld.so.conf  

添加在/ usr /本地/ SSL,然后运行ldconfig命令。

三,使用

如图1所示,头文件目录

  1. 在/ usr /本地/ SSL /包括  

  2. GCC编译的时候加-lssl,同时指定libssl.so。

在Android上使用OpenSSL通常涉及到JNI以及OpenSSL或BoringSSL的平台版本。在Zygote初始化期间,该平台很可能会在启动时加载系统版本的libssl.solibcrypto.so。由于加载器和符号解析的问题,习惯的LD_LIBRARY_PATH技巧不适用于大多数应用程序。而更改构建输出不同的库名称,如libmyssl.solibmycrypto.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的。


欢迎关注微信号:魅影响

或扫描下方二维码关注


猜你喜欢

转载自blog.csdn.net/meiwei_1/article/details/79194201