一、环境准备
我用的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
出现如上错误,使用Xcode打开build目录下的GmSSL工程,选择TARGETS-->gmssl-->Build Setting-->Signing配置中设置Development Team,然后重新执行cmake --build . --config Release命令。
编译模拟器动态库:Xcode打开GmSSL工程,cmd+b快捷键编译工程。
编译真机动态库:使用数据线将电脑和手机连接,Xcode打开GmSSL工程选择真机编译,
Debug目录下的libgmssl.3.1.dylib即为动态库,将动态库重新命名为gmssl3.dylib
2.5、使用动态库
- 添加动态库到iOS工程,复制GmSSL源码根目录下的include文件添加到iOS工程。
- 修改头文件搜索路径
- 解决动态库头文件找不到的错误
全局搜索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中。
3.5、设置环境变量
- 执行export PATH=$PATH:下载到本地的ndk路径
export PATH=$PATH:/Users/xxxx/Desktop/out/android-ndk-r21e
- 检查设置是否生效
ndk-build -version
如果有输出Copyright (C) 1988-2016 Free Software Foundation, Inc.等信息则设置生效。
3.6、执行编译
- 在GmSSL源码根目录下执行编译
ndk-build
如果编译过程中弹出<未识别的来源>弹窗,在设置-->隐私与安全性-->安全性中点击允许,然后重新执行编译。
3.7、编译中可能遇到的问题
- 源码都文件找不到
这个问题是在Android.mk文件中LOCAL_C_INCLUDES设置的头文件路径下找不到头文件,解决办法是将头文件目录复制到设置的路径下即可。
- 编译过程中找不到方法或变量的引用
解决办法是找到声明方法或者变量的.c文件添加到Android.mk中的LOCAL_SRC_FILES源文件列表中即可。
- Android.mk源文件列表中添加的.c文件找不到
解决办法是删除Android.mk源文件列表sm4_common.c文件的声明