GMSSL2.x编译鸿蒙静态库和动态库及使用

一、编译环境准备

1.1 开发工具

DevEco-Studio下载。

1.2 SDK下载

​ 下载编译第三方库的SDK有两种方式,第一种方式从官方渠道根据电脑系统选择对应的SDK版本,第二种方式通过DevEco-Studio下载SDK。本文只介绍通过DevEco-Studio下载SDK的方式。

  • 安装SDK到本地

Xnip2024-07-22_09-55-12

Xnip2024-07-22_10-13-51 Xnip2024-07-22_10-25-15
  • 根据SDK安装位置获取SDK

Xnip2024-07-22_10-38-51

  • 将SDK复制到GMSSL的同级目录并更名为ohos-sdk

Xnip2024-07-22_16-36-50

二、编译鸿蒙架构

​ 第三方库编译鸿蒙架构有两种方式。一种是使用C/C++原生构建工具configure、makefile编译,一种是使用lycium框架快速交叉编译。本文只详细介绍通过configure、makefile编译的方式。

2.1 原生工具构建

  • 编写编译脚本

    #!/bin/bash# Define paths and environment variables
    # 获取脚本当前所在路径
    CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    # 获取GmSSL源码路径
    GMSSL_DIR=$CURRENT_PATH/GmSSL2.5.4
    # 取脚本执行的第一个参数
    OHOS_TARGET_ABI=$1
    # 获取鸿蒙SDK路径
    export OHOS_SDK=$CURRENT_PATH/ohos-sdk# 编译64位架构
    if [ "$OHOS_TARGET_ABI" == "arm64-v8a" ]
    thenexport AS=${OHOS_SDK}/native/llvm/bin/llvm-asexport CC=${OHOS_SDK}/native/llvm/bin/aarch64-unknown-linux-ohos-clangexport CXX=${OHOS_SDK}/native/llvm/bin/aarch64-unknown-linux-ohos-clang++export LD=${OHOS_SDK}/native/llvm/bin/ld.lldexport STRIP=${OHOS_SDK}/native/llvm/bin/llvm-stripexport RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlibexport OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdumpexport OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopyexport NM=${OHOS_SDK}/native/llvm/bin/llvm-nmexport AR=${OHOS_SDK}/native/llvm/bin/llvm-arexport CFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1"export CXXFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1"outdir=arm64-v8acd ${GMSSL_DIR}./Configure linux-aarch64elif [ "$OHOS_TARGET_ABI" == "armeabi-v7a" ]
    then
    #编译32位架构export AS=${OHOS_SDK}/native/llvm/bin/llvm-asexport CC=${OHOS_SDK}/native/llvm/bin/armv7-unknown-linux-ohos-clangexport CXX=${OHOS_SDK}/native/llvm/bin/armv7-unknown-linux-ohos-clang++export LD=${OHOS_SDK}/native/llvm/bin/ld.lldexport STRIP=${OHOS_SDK}/native/llvm/bin/llvm-stripexport RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlibexport OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdumpexport OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopyexport NM=${OHOS_SDK}/native/llvm/bin/llvm-nmexport AR=${OHOS_SDK}/native/llvm/bin/llvm-arexport CFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1"export CXXFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1"outdir=armeabi-v7acd ${GMSSL_DIR}./Configure linux-generic32elif [ "$OHOS_TARGET_ABI" == "x86_64" ]
    then
    #编译32位架构export AS=${OHOS_SDK}/native/llvm/bin/llvm-asexport CC=${OHOS_SDK}/native/llvm/bin/x86_64-unknown-linux-ohos-clangexport CXX=${OHOS_SDK}/native/llvm/bin/x86_64-unknown-linux-ohos-clang++export LD=${OHOS_SDK}/native/llvm/bin/ld.lldexport STRIP=${OHOS_SDK}/native/llvm/bin/llvm-stripexport RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlibexport OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdumpexport OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopyexport NM=${OHOS_SDK}/native/llvm/bin/llvm-nmexport AR=${OHOS_SDK}/native/llvm/bin/llvm-arexport CFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1"export CXXFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1"outdir=x86_64# Navigate to OpenSSL directory./Configure linux-x86_64elseecho "Unsupported target ABI: $ANDROID_TARGET_ABI"exit 1
    fimake# Copy the outputs
    OUTPUT_INCLUDE=$CURRENT_PATH/ohos_libs/include
    OUTPUT_LIB=$CURRENT_PATH/ohos_libs/lib/${outdir}
    mkdir -p $OUTPUT_INCLUDE
    mkdir -p $OUTPUT_LIB
    cp -RL include/openssl $OUTPUT_INCLUDE
    cp libcrypto.so.1.1 $OUTPUT_LIB
    cp libcrypto.a $OUTPUT_LIB
    cp libssl.so.1.1 $OUTPUT_LIB
    cp libssl.a $OUTPUT_LIB

    将编写好的脚本文件命名为ohos.sh。文件之间的目录结构如下:

    Xnip2024-07-22_11-23-56

  • 执行脚本

    cd到HarmonyOS-SDK目录下,依次执行如下命令,分别编译64位、32位、x86_64的鸿蒙架构。

    ohos.sh  arm64-v8a
    ohos.sh  armeabi-v7a
    ohos.sh  x86_64
  • 编译问题

    截屏2024-07-19 11.11.09

    解决方案:删除GMSSL2.5.4源码中对getcontext、makecontext、setcontext等函数的引用。

2.2 使用lycium框架编译

  • 环境配置

    查看环境配置文档

  • 编译步骤

    查看lycium编译步骤

三、使用库文件

​ 鸿蒙工程可以使用.a的静态库和.so的动态库,两种类型的库引用一种即可。

3.1 创建NAPI工程

​ NAPI是OpenHarmony系统中的原生模块扩展开发框架,提供JavaScript与C/C++模块之间相互调用的交互能力。

Xnip2024-07-22_14-43-42

  • 添加二进制文件到工程

Xnip2024-07-22_15-03-28

如果该三方库二进制文件为so文件,还需要将so文件拷贝到工程目录的entry/libs/${OHOS_ARCH}/目录下,如下图:

so_location

3.2 配置链接

​ 添加二进制文件后需要在cpp目录的CMakeLists.txt文件中添加对应target_link_libraries才能被工程引用。

  • 配置静态库链接

    target_link_libraries(product PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gmssl/${OHOS_ARCH}/lib/libcrypto.a)
    target_link_libraries(product PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gmssl/${OHOS_ARCH}/lib/libssl.a)
  • 配置动态库链接

    target_link_libraries(product PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gmssl/${OHOS_ARCH}/lib/libcrypto.so)
    target_link_libraries(product PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gmssl/${OHOS_ARCH}/lib/libssl.so)
  • 配置头文件

    target_include_directories(product PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gmssl/${OHOS_ARCH}/include)

Xnip2024-07-22_15-16-13

四、编写NAPI接口

​ 配置完三方库的链接和头文件路径后,可以根据各自的业务逻辑调用三方库对应的接口完成NAPI接口的编写,NAPI接口开发可以参照以下文档学习。

  1. 使用Node-API实现跨语言交互开发流程

  2. C/C++三方库使用

4.1 NAPI编写示例

​ NAPI接口编写的基本思路是将从JavaScript层传入的参数转成C/C++数据类型,然后调用第三方库接口执行业务逻辑,最后将执行的结果转成JavaScript数据类型返回给JavaScript层。

Xnip2024-07-22_15-43-46

  • 编写接口

    napi_init.cpp文件中编写NAPI接口。

第一步:获取JS层传入的参数转成C/C++数据类型并将转换的结果作为参数传入第三方库函数中。

static napi_value gm_post(napi_env env, napi_callback_info info){size_t argc = 4;napi_value args[4];// 获取JS参数napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);char url[512] = {0},parameter[MAX_BUF] = {0}, filePath[1024] = {0};size_t url_len,parameter_len,filePath_len;double timeOut;// 获取请求地址 napi(JS)数据类型转c/c++数据类型napi_get_value_string_utf8(env, args[0], url, sizeof(url), &url_len);// 获取请求参数 napi(JS)数据类型转c/c++数据类型napi_get_value_string_utf8(env, args[1], parameter, sizeof(parameter), &parameter_len);// 获取超时时间napi_get_value_double(env, args[2], &timeOut);// 获取证书路径napi_get_value_string_utf8(env, args[3], filePath, sizeof(filePath), &filePath_len);// 调用gmssl库的post请求方法resp_t *resp = infosecPost(url, parameter, timeOut, NULL, filePath);// 格式转换后返回响应数据return transformRespToNapi(env, resp);
}

第二步:将第三方库返回的结果转成JavaScript数据类型

static napi_value transformRespToNapi(napi_env env,resp_t *resp){napi_value res_obj;// 1.创建对象napi_status status = napi_create_object(env, &res_obj);if (status != napi_ok) {napi_throw_error(env,"-1","创建响应数据对象异常");return nullptr;}// 2.创建data属性值napi_value res_data;status = napi_create_string_utf8(env, resp->data, NAPI_AUTO_LENGTH, &res_data);if (status != napi_ok) {napi_throw_error(env,"-2","创建属性值异常");return nullptr;}status = napi_set_named_property(env, res_obj, "data", res_data);if (status != napi_ok) {napi_throw_error(env,"-3","设置对象的属性异常");return nullptr;}// 3.创建code属性napi_value res_code;status = napi_create_double(env, resp->code, &res_code);if (status != napi_ok) {napi_throw_error(env,"-2","创建属性值异常");return nullptr;}status = napi_set_named_property(env, res_obj, "code", res_code);if (status != napi_ok) {napi_throw_error(env,"-3","设置对象的属性异常");return nullptr;}resp_free(resp);return res_obj;
}

第三步:ArkTS接口与C/C++接口绑定和映射

EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{napi_property_descriptor desc[] = {{ "send_gm_post", nullptr, gm_post, nullptr, nullptr, nullptr, napi_default, nullptr }};napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);return exports;
}
EXTERN_C_END

​ 说明:send_gm_post是ArkTS的函数名,gm_post是C/C++函数名。

  • 声明ArkTS侧的方法

Index.d.ts文件中声明ArkTS侧的方法。

export const send_gm_post: (url: string,parameters:string,timeOut:number,caPath:string) => object;

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

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

相关文章

centos中zabbix安装、卸载及遇到的问题

目录 Zabbix简介Zabbix5.0和Zabbix7.0的区别监控能力方面模板和 API 方面性能、速度方面 centos7安装Zabbix(5.0)安装zabbix遇到的问题卸载Zabbix Zabbix简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参…

大数据架构体系演进

传统离线大数据架构 ​ 21世纪初随着互联网时代的到来,数据量暴增,大数据时代到来。Hadoop生态群及衍生技术慢慢走向“舞台”,Hadoop是以HDFS为核心存储,以MapReduce(简称MR)为基本计算模型的批量数据处理…

MATLAB实验五:MATLAB数据分析

1. 某线路上不同时间对应的电压如下表所示: 1)用 3 次多项式拟合(polyfit)该实验曲线,要求绘制 2 原始采样 点,并在 1~8 范围内,使用时间间隔为 0.2 的数据绘制拟合曲线。 建立一个脚本文件:text5_1.m 如下…

黑马JavaWeb企业级开发(知识清单)01——前端介绍,HTML实现标题:排版

文章目录 前言一、认识web前端、HTML、CSS二、VS Code开发工具&#xff08;插件弃用问题&#xff09;三、HTML结构标签介绍1. 标签页标题< title >2. 图片标签< img >1) 常见属性2) src路径书写方式 3. 标题标签< h >4. 水平分页线标签< hr > 四、用Vs…

安全的备忘录工具有哪些 安全好用的备忘录

在这个数字化的时代&#xff0c;我们的生活中充斥着各种各样的信息&#xff0c;从工作计划到个人琐事&#xff0c;从账号密码到重要日期&#xff0c;这些信息都需要我们牢记。然而&#xff0c;人的记忆毕竟有限&#xff0c;于是&#xff0c;备忘录工具成为了我们日常生活中不可…

运行 npm install 报错-4048

我在已经开发中的项目&#xff0c;执行 npm install 命令时&#xff0c;出现报错&#xff1a; 并且之前在帖子中提到的报错类型还不一样&#xff08;帖子内容如下&#xff09;&#xff1a; 运行 npm run dev 总报错_运行npm run dev报错-CSDN博客 该报错内容主要为权限导致的&…

C# 编程机器人

右边写代码&#xff0c;控制左边机器人移动 冯腾飞/编程机器人 - Gitee.com

SpringBoot框架学习笔记(五):静态资源访问、Rest风格请求处理、配置视图解析器、接收参数的相关注解详解

1 WEB开发-静态资源访问 1.1 基本介绍 &#xff08;1&#xff09;只要静态资源放在类路径的以下目录&#xff1a;/static、/public、/resources、/META-INF/resources 可以被直接访问。maven项目的类路径即为main/resources目录--对应SpringBoot源码为WebProperties.java类 …

基于STM32的PM2.5监测系统设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕业设计&#xff0c;今天给大家分享的是《基于STM32的PM2.5监测系统设计》。 设备的详细功能见网…

Nginx 怎样处理请求的重试机制?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 怎样处理请求的重试机制&#xff1f;一、为何需要重试机制&#xff1f;二、Nginx 中的重试机制原理三、Nginx 重试机制的配置参数四、Nginx 重试机制的实际…

GPT盘新增容量后如何扩容?

场景&#xff1a;一块5T的GPT盘&#xff0c;现有需求再加10T&#xff0c; 在虚拟化平台加10T盘后&#xff0c;机器不重启&#xff0c;执行命令 echo 1 > /sys/block/sdb/device/rescan刷新磁盘容量&#xff0c;可看到容量已刷出。 但执行fdisk /dev/sdb时&#xff0c;发现创…

《0基础》学习Python——第二十二讲__网络爬虫/<5>爬取豆瓣电影封面图

一、爬取豆瓣电影的图片封面 1、经过上节课我们所爬取的豆瓣电影的电影名、年份、国家、导演、主演、剧情&#xff0c;那么接下来我们将学习如何去爬取这些电影的图片&#xff0c;并将这些图片存放在文件夹中。 2、过程实现&#xff1a; 2.1、获取网页源码 首先还是和爬取电影名…

Air780EP-AT开发-HTTP应用指南

简介 关联文档和使用工具&#xff1a; AT固件获取AT指令手册 概述 4G模块支持HTTP和HTTPS协议&#xff0c; HTTP应用的基本流程如下&#xff1a; 1、激活PDP&#xff08;参考&#xff1a;http://oldask.openluat.com/article/937&#xff09;2、初始化HTTP服务3、设置HTTP会话…

服务器上使用Docker部署sonarQube,并集成到Jenkins实现自动化。

目标是要在目标服务器上使用docker工具部署好sonar环境&#xff0c;然后再集成到Jenkins中实现自动化的代码审查工作。 Docker 首先Dokcer的源大部分现在都用不了&#xff0c;于是我上网查询&#xff0c;终于找到了一个可用的镜像。 编辑/etc/docker/daemon.json文件&#x…

Linux中的时间函数

参考&#xff1a; 几种取时间的方法&#xff08;附代码&#xff09; Linux中gmtime和localtime的区别(time_t格式转换为tm格式) C 库函数 - time() mktime和localtime_r能在多线程环境下使用么&#xff1f; Linux_C环境编程&#xff1a;时间日期函数总结 细说时间测量RDT…

探索NVM:让Node.js开发如虎添翼的利器

文章目录 前言一、NVM简介&#xff1a;版本管理的瑞士军刀二、NVM能解决什么问题&#xff1f;三、如何使用NVM​&#xff1f;总结 前言 在这个日新月异的编程世界里&#xff0c;Node.js凭借其高效的非阻塞I/O操作和轻量级的事件驱动模型&#xff0c;成为了全栈开发、微服务架构…

音视频入门基础:H.264专题(16)——FFmpeg源码中,判断某文件是否为H.264裸流文件的实现

一、引言 通过FFmpeg命令可以判断出某个文件是否为AnnexB格式的H.264裸流&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为AnnexB格式的H.264裸流呢&#xff1f;它内部其实是通过h264_probe函数来判断的。从文章《FFmpeg源码&#xff1a;av_probe_input_format3函数分析》中…

winfrom 文件自动生成

数据页面展示 添加定时器执行每个表数据的生成计划 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using …

【STM32嵌入式系统设计与开发---拓展】——1_11_1串口通信(USART)

这里写目录标题 1、一般我们都怎么进行通信的&#xff1f;&#xff08;1&#xff09;串行通行&#xff08;Serial Communication&#xff09;&#xff08;2&#xff09;并行通信&#xff08;3&#xff09;无线网络通信&#xff08;4&#xff09;网络通信&#xff08;5&#xff…

Django [实战] 通过表单上传文件

在Django中上传文件通常涉及到以下几个步骤&#xff1a; 设置你的模型以包含一个FileField或ImageField&#xff08;如果上传的是图片&#xff09;。创建一个表单&#xff0c;该表单包含一个Form或ModelForm&#xff0c;其中包含一个FileField。在你的视图中处理上传的文件。在…