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.pswp.cn/bicheng/15504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15504.shtml
英文地址,請注明出處:http://en.pswp.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;只能對單…

機器學習 - 模型訓練

機器學習&#xff08;Machine Learning&#xff0c;ML&#xff09;是利用計算機算法和統計模型&#xff0c;使計算機系統在沒有明確編程的情況下執行特定任務的過程。機器學習的整個過程可以分為以下幾個主要步驟&#xff1a; 訓練步驟 問題定義與需求分析 目標設定&#xff1…

【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;用戶界面的…

2024.5.25

package com.Swork.file;import java.io.File; import java.io.IOException; import java.util.Date;public class Demo1 {public static void main(String[] args) {//1,構造文件對象System.out.println("1,構造文件對象");File file new File("D://Work//Fil…

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…

leetcode119-Pascal‘s Triangle II

題目 給定一個非負索引 rowIndex&#xff0c;返回「楊輝三角」的第 rowIndex 行。 在「楊輝三角」中&#xff0c;每個數是它左上方和右上方的數的和。 示例 1: 輸入: rowIndex 3 輸出: [1,3,3,1] 分析 楊輝三角每位數字就是上一行同一列&#xff0b;上一行前一列的和&#…

結構體;結構成員訪問操作符

結構體&#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…

信息系統管理工程師知識點

信息系統管理工程師知識點 損壞包括自然災害、物理損壞&#xff08;磁盤壞、設備使用壽命&#xff0c;外力破損&#xff09;、設備故障&#xff08;停電、電磁干擾&#xff09;。 泄漏包括電磁輻射&#xff08;偵聽微機損傷過程&#xff09;、乘機而入&#xff08;合法用戶進…

一天了解一個機器學習模型——機器學習基礎知識

人工智能的兩大任務——預測和決策 預測包括對輸入目標的模式識別、標簽分類、回歸、預測未來數據、聚類 決策需要機器產生行動&#xff0c;改變狀態&#xff0c;如下圍棋、自動駕駛 支持人工智能的四大類技術 搜索——結合算法探索分支的好壞&#xff0c;從而做出決策&…

如何使用maven運行SpringBoot程序?

目錄 一、什么是maven 二、什么是SpringBoot 三、如何使用maven運行SpringBoot程序&#xff1f; 一、什么是maven Maven&#xff1a;簡化Java項目構建的自動化工具 在軟件開發的世界里&#xff0c;Maven以其強大的項目管理和構建自動化功能&#xff0c;為Java開發者提供了…

內存泄漏及其解決方法

1. 系統崩潰前的現象 垃圾回收時間延長&#xff1a;從原本的約10ms增長至50ms&#xff0c;Full GC時間也由0.5s增加至4-5s。Full GC頻率增加&#xff1a;最短間隔可縮短至1分鐘內發生一次。年老代內存持續增長&#xff1a;即使經過Full GC&#xff0c;年老代內存未見明顯釋放。…

容器化: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等。而且不需要…