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文件的声明

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Protobuf - 语法、字段使用规则、注意事项

目录 前言 一、Protobuf 基本语法 1.1、Protoc 版本 1.2、文件格式配置 1.3、消息字段规则 1.3.1、字段数据类型 1.3.2、字段修饰规则 1.3.3、消息类型定义 1.3.4、enum 类型 1.3.5、Any 类型 1.3.6、oneof 类型 1.3.7、map 类型 1.3.8、默认值 1.3.9、更新消息…

css设置文字在固定宽度中等距分开(仅限于单行文本)

一、要实现的效果&#xff1a; 二、代码 要在CSS中设置文本在一个固定宽度的容器中等距分开&#xff0c; 可以使用text-align: justify;属性&#xff0c;它可以让文本两端对齐&#xff0c;看起来就像是等距分开的。 但是要注意&#xff0c;单独使用text-align:justify;只能对单…

【Qt】Qt多元素控件深入解析与实战应用:列表(QListWidget)、表格(QTableWidget)与树形(QTreeWidget)结构

文章目录 前言&#xff1a;Qt中多元素控件&#xff1a;1. List Widget1.1. 代码示例: 使用 ListWidget 2.Table Widget2.1. 代码示例: 使用 QTableWidget 3. Tree Widget3.1. 代码示例: 使用 QTreeWidget 总结&#xff1a; 前言&#xff1a; 在Qt框架中&#xff0c;用户界面的…

C语言内存函数超详细讲解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 C语言内存函数超详细讲解 收录于专栏【C语言学习】 本专栏旨在分享学习C语言学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. m…

C++面向对象程序设计-北京大学-郭炜【课程笔记(十一)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;十一&#xff09;】 1、string&#xff08;重要知识点&#xff09;1.2、string的赋值和链接1.3、比较string1.4、子串1.5、交换string1.6、寻找string中的字符1.7、删除string中的字符1.8、替换string中的字符1.9、在str…

结构体;结构成员访问操作符

结构体&#xff1a; 虽然c语言已经提供了内置类型&#xff0c;比如&#xff1a;char、short、int、long等&#xff0c;但还是不够用&#xff0c;就好比我描述一个人&#xff0c;我需要描述他的身高&#xff0c;体重&#xff0c;年龄&#xff0c;名字等信息&#xff0c…

微软密谋超级AI大模型!LangChain带你轻松玩转大模型开发

此前&#xff0c;据相关媒体报道&#xff0c;微软正在研发一款名为MAI-1的最新AI大模型&#xff0c;其参数规模或将达5000亿以上&#xff0c;远超此前微软推出的相关开源模型&#xff0c;其性能或能与谷歌的Gemini 1.5、Anthropic的Claude 3和OpenAI的GPT-4等知名大模型相匹敌。…

Linux文本处理三剑客(详解)

一、文本三剑客是什么&#xff1f; 1. 对于接触过Linux操作系统的人来说&#xff0c;应该都听过说Linux中的文本三剑客吧&#xff0c;即awk、grep、sed&#xff0c;也是必须要掌握的Linux命令之一&#xff0c;三者都是用来处理文本的&#xff0c;但侧重点各不相同&#xff0c;a…

Sam Altman微软Build 2024最新演讲:AI可能是下一个移动互联网

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【C++11】lambda匿名函数和包装器

目录 一&#xff0c;lambda匿名函数 1-1&#xff0c;lambda的引入 1-2&#xff0c;lambda表达式书写格式 1-3&#xff0c;lambda函数的名称 1-4&#xff0c;lambda捕获列表的使用 1-5&#xff0c;函数对象与lambda表达式 二&#xff0c;包装器 2-1&#xff0c;function…

如何使用maven运行SpringBoot程序?

目录 一、什么是maven 二、什么是SpringBoot 三、如何使用maven运行SpringBoot程序&#xff1f; 一、什么是maven Maven&#xff1a;简化Java项目构建的自动化工具 在软件开发的世界里&#xff0c;Maven以其强大的项目管理和构建自动化功能&#xff0c;为Java开发者提供了…

容器化:ES和Kibana

1 缘起 最近在学习使用ES&#xff0c; 为了找一个功能强大的可视化工具&#xff0c;之前使用了ES-Head&#xff0c;可以满足学习需求。 闲暇时间又折腾了另一个工具Kibana&#xff0c; 分享如下。 Kibana优点&#xff1a; 用户友好性&#xff1a;Kibana提供直观易用的用户界面…

Strategy设计模式

Strategy设计模式举例。 看图&#xff1a; 代码实现&#xff1a; #include <iostream>using namespace std;class FlyBehavior { public:virtual void fly() 0; };class QuackBehavior { public:virtual void quack() 0; };class FlyWithWings :public FlyBehavior …

数据库(vb.net+OleDB+Access)简易学生信息管理系统

在我们日常生活当中&#xff0c;数据库一词往往离不开我们的编程界&#xff0c;在学校、仓库等方面起着存储数据及数据关系作用的文件。相较于Excel&#xff0c;Access可以存储无限多的记录&#xff0c;内容也十分丰富&#xff0c;例如文本、数字、日期、T&F等。而且不需要…

k8s命令式对象管理和配置

kubectl补全: # dnf install -y bash-completion # echo "source <(kubectl completion bash)" >> ~/.bashrc # kubectl completion bash > /etc/bash_completion.d/kubectl 命令式对象管理 kubectl命令 # 查看所有pod kubectl get pod # 查看某个po…

LLM——探索大语言模型在心理学方面的应用研究

1. 概述 心理学经历了多次理论变革&#xff0c;目前人工智能&#xff08;AI&#xff09;和机器学习&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;的使用&#xff0c;预示着新研究方向的开启。本文详细探讨了像ChatGPT这样的LLMs如何转变心理学研究。它讨论了LL…

docker- 镜像 导出导入

文章目录 前言docker- 镜像 导出导入1. 导出2. 删除镜像3. 导入镜像 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

忘记“也是一门学问:机器如何忘记自己学到的知识?

在信息时代&#xff0c;我们常常希望人工智能能够学到更多的知识&#xff0c;变得更加智能。但你是否想过&#xff0c;有时候让机器"忘记"一些它学到的东西&#xff0c;也是一件很重要的事&#xff1f; 随着用户隐私保护意识的提高和相关法律法规的出台&#xff0c;…

深入理解内联函数(C语言)

目录 1.什么是内联函数2.内联函数与宏3.编译器对内联函数的处理4.参考文献 1.什么是内联函数 很多人都会知道&#xff0c;可以将比较小的函数写成内联函数的形式&#xff0c;这样会节省函数调用的开销&#xff0c;具体是什么样的开销呢&#xff1f; 一个函数在执行过程中&…

IDEA通过tomcat运行注意事项

配置run--》edit configurations 以下的A B部分要保持一致 A和B的路径要保持一致