当前位置:   article > 正文

GmSSL3.X编译iOS和Android动态库

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
  • 1
2.2、创建Build目录
mkdir build; cd build
  • 1
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
  • 1
cmake --build . --config Release
  • 1

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
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

  • 1
  • 2
  • 3
  • 4
  • 5
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
  • 1
  • 检查设置是否生效
ndk-build -version
  • 1

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/614190
推荐阅读
相关标签
  

闽ICP备14008679号