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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值