GmSSL3.X编译iOS和Android动态库

一、环境准备

我用的Mac电脑编译,Xcode版本15.2,安卓的NDK版本是android-ndk-r21e。

1.1、下载国密源码

下载最新的国密SDK源码到本地。

1.2、安装Xcode

前往Mac系统的AppStore下载安装最新Xcode。

1.3、安卓NDK下载

下载NDK到本地,选择一个比较新的版本下载即可,我选择的是android-ndk-r21e-darwin-x86_64.zip。

二、iOS动态库编译

2.1、进入源码根目录
cd /Users/xxxx/Downloads/GmSSL-master
2.2、创建Build目录
mkdir build; cd build
2.3、下载ios.toolchain.cmake

下载ios.toolchain.cmake,将ios.toolchain.cmake文件复制到源码的根目录。

2.4、编译arm64和x86_64

在build目录下执行下面命令

cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=OS64COMBINED
cmake --build . --config Release

sc_20240518120629

出现如上错误,使用Xcode打开build目录下的GmSSL工程,选择TARGETS–>gmssl–>Build Setting–>Signing配置中设置Development Team,然后重新执行cmake --build . --config Release命令。

sc_20240518122452

编译模拟器动态库:Xcode打开GmSSL工程,cmd+b快捷键编译工程。

编译真机动态库:使用数据线将电脑和手机连接,Xcode打开GmSSL工程选择真机编译,

sc_20240518123519

Debug目录下的libgmssl.3.1.dylib即为动态库,将动态库重新命名为gmssl3.dylib

2.5、使用动态库
  • 添加动态库到iOS工程,复制GmSSL源码根目录下的include文件添加到iOS工程。

sc_20240518125459

  • 修改头文件搜索路径

在这里插入图片描述

  • 解决动态库头文件找不到的错误

全局搜索gmssl/,全部替换为空即可

在这里插入图片描述

  • 解决动态库文件连接不到的问题

在这里插入图片描述

Build Phases创建Copy Files

在这里插入图片描述

添加动态库路径

在这里插入图片描述

点"+"添加动态库

在这里插入图片描述

  • 选择模拟器重新运行

三、Android动态库编译

3.1、NDK下载

下载方法查看1.3章节

3.2、创建Android.mk
LOCAL_PATH := $(call my-dir) //获取当前文件路径
include $(CLEAR_VARS)
# 编译的源文件列表
LOCAL_SRC_FILES := ../src/version.c \
				../src/debug.c \
				../src/sm4_common.c \
				../src/sm4_enc.c \
				../src/sm4_modes.c \
				../src/sm4_setkey.c \
				../src/sm3.c \
				../src/rand.c \
				../src/http.c \
				../src/sm3_hmac.c \
				../src/sm3_kdf.c \
				../src/sm2_alg.c \
				../src/sm2_key.c \
				../src/sm2_lib.c \
				../src/sm9_alg.c \
				../src/sm9_key.c \
				../src/sm9_lib.c \
				../src/zuc.c \
				../src/zuc_modes.c \
				../src/aes.c \
				../src/aes_modes.c \
				../src/sha256.c \
				../src/sha512.c \
				../src/chacha20.c \
				../src/hash_drbg.c \
				../src/block_cipher.c \
				../src/digest.c \
				../src/hmac.c \
				../src/hkdf.c \
				../src/pbkdf2.c \
				../src/gf128.c \
				../src/gcm.c \
				../src/aead.c \
				../src/pkcs8.c \
				../src/ec.c \
				../src/rsa.c \
				../src/asn1.c \
				../src/hex.c \
				../src/base64.c \
				../src/pem.c \
				../src/x509_alg.c \
				../src/x509_cer.c \
				../src/x509_ext.c \
				../src/x509_req.c \
				../src/x509_crl.c \
				../src/x509_new.c \
				../src/cms.c \
				../src/sdf/sdf.c \
				../src/sdf/sdf_lib.c \
				../src/sdf/sdf_meth.c \
				../src/sdf/sdf_ext.c \
				../src/sdf/sdf_sansec.c \
				../src/skf/skf.c \
				../src/skf/skf_lib.c \
				../src/skf/skf_meth.c \
				../src/skf/skf_ext.c \
				../src/skf/skf_prn.c \
				../src/skf/skf_wisec.c \
				../src/socket.c \
				../src/tls.c \
				../src/tls_ext.c \
				../src/tls_trace.c \
				../src/tlcp.c \
				../src/tls12.c \
				../src/tls13.c \
				../src/file.c \
				../tools/gmssl.c \
				../tools/version.c \
				../tools/sm4.c \
				../tools/sm3.c \
				../tools/sm3hmac.c \
				../tools/sm2keygen.c \
				../tools/sm2sign.c \
				../tools/sm2verify.c \
				../tools/sm2encrypt.c \
				../tools/sm2decrypt.c \
				../tools/sm9setup.c \
				../tools/sm9keygen.c \
				../tools/sm9sign.c \
				../tools/sm9verify.c \
				../tools/sm9encrypt.c \
				../tools/sm9decrypt.c \
				../tools/zuc.c \
				../tools/rand.c \
				../tools/pbkdf2.c \
				../tools/certgen.c \
				../tools/certparse.c \
				../tools/certverify.c \
				../tools/certrevoke.c \
				../tools/reqgen.c \
				../tools/reqparse.c \
				../tools/reqsign.c \
				../tools/crlgen.c \
				../tools/crlget.c \
				../tools/crlparse.c \
				../tools/crlverify.c \
				../tools/cmssign.c \
				../tools/cmsverify.c \
				../tools/cmsencrypt.c \
				../tools/cmsdecrypt.c \
				../tools/cmsparse.c \
				../tools/sdfutil.c \
				../tools/skfutil.c \
				../tools/tlcp_client.c \
				../tools/tlcp_server.c \
				../tools/tls12_client.c \
				../tools/tls12_server.c \
				../tools/tls13_client.c \
				../tools/tls13_server.c \
# 包含的头文件目录
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
# 生成的动态库名称
LOCAL_MODULE := gmssl
include $(BUILD_SHARED_LIBRARY)
3.3、创建Application.mk文件
# APP_ABI 定义了要构建的目标平台,例如 armeabi-v7a、arm64-v8a、x86 和 x86_64
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
# APP_PLATFORM 定义了要针对的 Android 平台版本
APP_PLATFORM := android-21

3.4、创建jni目录

在GmSSL源码根目录下创建jni目录,NDK编译过程中在jni目录下查询编译描述文件,所以要将Android.mk和Application.mk文件放在jni中。

sc_20240518144133

3.5、设置环境变量
  • 执行export PATH=$PATH:下载到本地的ndk路径
export PATH=$PATH:/Users/xxxx/Desktop/out/android-ndk-r21e
  • 检查设置是否生效
ndk-build -version

如果有输出Copyright © 1988-2016 Free Software Foundation, Inc.等信息则设置生效。

3.6、执行编译
  • 在GmSSL源码根目录下执行编译
ndk-build

如果编译过程中弹出<未识别的来源>弹窗,在设置–>隐私与安全性–>安全性中点击允许,然后重新执行编译。

3.7、编译中可能遇到的问题
  1. 源码都文件找不到

在这里插入图片描述

这个问题是在Android.mk文件中LOCAL_C_INCLUDES设置的头文件路径下找不到头文件,解决办法是将头文件目录复制到设置的路径下即可。

在这里插入图片描述

  1. 编译过程中找不到方法或变量的引用

在这里插入图片描述

解决办法是找到声明方法或者变量的.c文件添加到Android.mk中的LOCAL_SRC_FILES源文件列表中即可。

  1. Android.mk源文件列表中添加的.c文件找不到

sc_20240518150958

解决办法是删除Android.mk源文件列表sm4_common.c文件的声明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/642656.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务可用性之隔离

摘要 ​ 本文主要微服务场景下服务的可用性保障之隔离。隔离又分为几种情况&#xff0c;动静隔离、读写隔离、热点隔离、资源隔离等场景。 为什么要隔离 ​ 本质上是对资源进行分割确保在出现故障的时候服务只是部分不可用&#xff0c;不至于系统陷入整体性瘫痪&#xff0c;…

推特热帖:大语言模型自荐能够替代的20种人类工作!快来看你是否需要转行!

最近推特上有一个例子引起了广泛的讨论&#xff0c;事情的起因是这样的&#xff1a;网友让 GPT-4o 预测一下自己未来将会替代人类哪些工作&#xff1f; 这听起来很有趣&#xff01;GPT-4o会给出什么样的预测呢&#xff1f; 3.5研究测试&#xff1a;hujiaoai.cn 4研究测试&…

TypeScript学习日志-第三十二天(infer关键字)

infer关键字 一、作用与使用 infer 的作用就是推导泛型参数&#xff0c;infer 声明只能出现在 extends 子语句中&#xff0c;使用如下&#xff1a; 可以看出 已经推导出类型是 User 了 二、协变 infer 的 协变会返回联合类型&#xff0c;如图&#xff1a; 三、逆变 infer…

Redis - 优惠卷秒杀

场景分析 为了避免对数据库造成压力&#xff0c;我们在新增优惠卷的时候&#xff0c;可以将优惠卷的信息储存在Redis中&#xff0c;这样用户抢购的时候访问优惠卷信息&#xff0c;通过Redis读取信息。 抢购流程&#xff1a; 业务分析 既然在新增优惠卷的时候&#xff0c;我…

【数据结构与算法】之堆的应用——堆排序及Top_K问题!

目录 1、堆排序 2、Top_K问题 3、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、堆排序 对一个无序的数组…

安卓开发--安卓使用Echatrs绘制折线图

安卓开发--安卓使用Echatrs绘制折线图 前期资料安卓使用Echarts绘制折线图1.1 下载 Echarts 安卓资源1.2 新建assets文件1.3 新建布局文件1.4 在布局文件中布局WebView1.5 在活动文件中调用 最终效果 前期资料 Echarts 官网样式预览: https://echarts.apache.org/examples/zh/…

Java开发者必知的时间处理工具:SimpleDateFormat类详解

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …

ABB 任务 模块 程序

1&#xff0c;任务由模块组成 &#xff0c; 2&#xff0c;模块分为程序模块和系统模块 3&#xff0c;可以通过新建程序模块和删除程序模块 4.可以在程序模块中构建程序 5&#xff0c;系统模块不能够被删除 6&#xff0c;main 程序主要体现在自动运行中

C++—— set、map、multiset、multimap的介绍及使用

目录 关联式容器 关联式容器的特点和使用场景 树形结构与哈希结构 树形结构 哈希结构 键值对 set set的介绍 set的定义方式 set的使用 multiset map map的介绍 map的定义方式 map的使用 multimap 关联式容器 C标准模板库&#xff08;STL&#xff09;中的关联…

【2024最新华为OD-C卷试题汇总】传递悄悄话的最长时间(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 前…

Mysql插入中文内容报错解决及其Mysql常用的存储引擎说明

一、问题描述 我们在Mysql数据库的表中插入带有中文内容时报错,提示【1366 - Incorrect string value: \xE5\x8C\x97\xE4\xBA\xAC... for column UserDealer at row 1】,如下图所示: 二、问题分析 一般来说插入中文内容有问题我们首先想到的就是编码问题;我们可以查看该表使…

C语言之指针进阶(3),函数指针

目录 前言&#xff1a; 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结&#xff1a; 前言&#xff1a; 本文主要讲述C语言指针中的函数指针&#xff0c;包括函数指针变量的概念、创建…

git分支策略(github-flow VS git flow,如何选择)

一. 结论 Github flow&#xff1a;最简单 小型项目&#xff0c;持续部署&#xff0c;自动化测试程度高&#xff0c;发布流程简单 Git flow&#xff1a;复杂但最常用 大型项目&#xff0c;发布周期长&#xff0c;需要同时维护多个版本&#xff0c;发布流程复杂 表格提供了不…

【算法设计与分析】基于Go语言实现动态规划法解决TSP问题

本文针对于最近正在学习的Go语言&#xff0c;以及算法课实验所需内容进行Coding&#xff0c;一举两得&#xff01; 一、前言 由于这个实验不要求向之前的实验一样做到那种连线的可视化&#xff0c;故可以用图形界面不那么好实现的语言进行编写&#xff0c;考虑到Go语言的…

2、xss-labs之level2

1、打开页面 2、传入xss代码 payload&#xff1a;<script>alert(xss)</script>&#xff0c;发现返回<script>alert(xss)</script> 3、分析原因 打开f12&#xff0c;没什么发现 看后端源码&#xff0c;在这form表单通过get获取keyword的值赋给$str&am…

下雨!大水蚁引发的水文!看比赛咯,曼联VS曼城——早读(逆天打工人爬取热门微信文章解读)

唠唠嗑 水一水 引言Python 代码结尾 引言 今天星期六 大小周 一个等了很久的双休 昨天晚上真的是吓到我了 漫天的小飞虫 我一开始还以为是一两只 没想到那些小飞虫 从阳台不断飞进来 在山卡拉下面租房子 也是太恐怖了 来个特写 他们也就一个晚上的时间 成虫 天气合适 长翅…

使用docker commit创建新镜像

前言 我们知道&#xff0c;从docker-hub上拉取的镜像所创建的容器是最小版本的&#xff0c;比如ubuntu内部是没有vim编辑器的&#xff0c;我们需要自己手动安装&#xff0c;但是当我们安装后假如有人把我们的容器误删了&#xff0c;那么我们再次根据原始镜像创建的容器就没有了…

优先级队列(堆)的实现

1.什么是优先级队列 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如&#x…

Drone+Gitee自动执行构建、测试和发布工作流

拉取Drone:(至于版本&#xff0c;你可以下载最新的) sudo docker pull drone/drone:2 拉取runner&#xff1a; sudo docker pull drone/drone-runner-docker 在Gitee中添加第三方应用&#xff1a; 进入个人主页&#xff0c;点击设置&#xff1a; 往下翻&#xff0c;找到数…