HarmonyOS编译开源native库(OpenSSL实例)

这篇具有很好参考价值的文章主要介绍了HarmonyOS编译开源native库(OpenSSL实例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

近期项目要开始做鸿蒙版本,有一部分依赖native的代码也需要迁移,某个native模块依赖openssl,需要在鸿蒙下重新编译openssl才行。一开始找了很多相关文档都没有得到方法,无奈只能自己凭经验慢慢试,最后还是成功了。

鸿蒙NDK下载地址

https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes#openharmony-release-notes

需要单独下载一份sdk,因为ide里面下载的sdk里面的ndk是不全的,缺少sysroot

如何编译

使用Cmake

上面的下载地址其实包含了编译三方库的教程,但是只有基于Cmake的方式,而且非常简陋,并没有提供一个真实的三方库编译教程,而实际开发中通常要复杂很多,需要编译的库往往有许多配置,还有一些子依赖,比较难以处理。另外有些库压根没有提供Cmake编译的方式,比如OpenSSL。如果库支持的话使用cmake编译相对简单一些,可以使用cmake-gui或者ide。

使用库提供的其他编译方式

大多数库都会提供一个配置脚本(./Configure)让使用者自定义进行编译,通常只需要配置好一些必要参数,必要工具的路径就可以比较轻松的完成,但是现在主流库肯定是没有鸿蒙支持的,所以需要自己额外配置的东西很多,接下来以编译OpenSSL为例。

先定义一个比较通用的配置脚本build_config.sh,方便以后编译其他库也能用,鸿蒙的编译器好像不像android那样需要区分api和架构,全都在llvm目录下,直接指定就可以了

另外还需要指定目标平台target、sysroot、cflags这些,我在文档里面没有找到,按照惯例找到了sdk里面的ohos.toolchain.cmake文件,参考这个文件进行了定义

比较麻烦的是编译openssl时需要指定的架构,openssl支持的架构配置在下图这些文件里面给了定义,但是没有鸿蒙的支持,那就只能选用linux的,linux-armv4、linux-aarch64这些。

harmonyos openssl 编译,HarmonryOS,harmonyos,开源,华为,native,编译

build_config.sh

 #NDK路径
    export OHOS_NATIVE_HOME=/Users/admin/Downloads/ohos-sdk/darwin/native
    export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
    #cpu架构
    if [ "$#" -lt 1 ]; then
    	THE_ARCH=armv7
    else
    	THE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
    fi

    BASE_FLAGS="--sysroot=$OHOS_NATIVE_HOME/sysroot -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -fPIC"

    #根据不同架构配置环境变量
    case "$THE_ARCH" in
      armv7a|armeabi-v7a)
    	OHOS_ARCH="armeabi-v7a"
        OHOS_TARGET="arm-linux-ohos"
        OPENSSL_ARCH="linux-armv4"
    	FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS -march=armv7a"
    	FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS -march=armv7a"
    	;;
      armv8|armv8a|aarch64|arm64|arm64-v8a)
    	OHOS_ARCH="arm64"
        OHOS_TARGET="aarch64-linux-ohos"
        OPENSSL_ARCH="linux-aarch64"
    	FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
    	FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
    	;;
      x86_64|x64)
    	OHOS_ARCH="x86_64"
        OHOS_TARGET="x86_64-linux-ohos"
        OPENSSL_ARCH="linux-x86_64"
    	FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
    	FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
    	;;
      *)
    	echo "ERROR: Unknown architecture $1"
    	[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
    	;;
    esac

    # 工具链
    TOOLCHAIN=$OHOS_NATIVE_HOME/llvm

    # 交叉编译库搜索路径
    SYS_ROOT=$OHOS_NATIVE_HOME/sysroot
    # 编译器
    CC=$TOOLCHAIN/bin/clang
    CXX=$TOOLCHAIN/bin/clang++
    # 链接器,将目标文件(包括静态库和共享库)合并成一个可执行文件或共享库
    LD=$TOOLCHAIN/bin/ld-lld
    # 汇编器,将汇编语言代码转换为机器代码
    AS=$TOOLCHAIN/bin/llvm-as
    # 静态库管理工具,用于创建、修改和提取静态库中的目标文件
    AR=$TOOLCHAIN/bin/llvm-ar
    # 符号表工具,用于显示目标文件中的符号(函数、变量等)信息
    NM=$TOOLCHAIN/bin/llvm-nm
    # 静态库索引工具,用于创建和更新静态库的索引,以提高库的访问速度
    RANLIB=$TOOLCHAIN/bin/llvm-ranlib
    # 剥离工具,用于从可执行文件或共享库中去除调试信息,从而减小文件大小
    STRIP=$TOOLCHAIN/bin/llvm-strip

接下来就比较简单了,再定义一个执行编译的脚本build_openssl.sh,可选的编译参数在configure文件里面,可以按需要配置

harmonyos openssl 编译,HarmonryOS,harmonyos,开源,华为,native,编译

build_openssl.sh

  #!/bin/bash
    ARCH=$1
    source build_config.sh $ARCH
    LIBS_DIR=$(cd `dirname $0`; pwd)/libs/openssl
    PREFIX=$LIBS_DIR/$OHOS_ARCH

    echo "PREFIX"=$PREFIX

    export CC="$CC"
    export CXX="$CXX"
    export CXXFLAGS=$FF_EXTRA_CFLAGS
    export CFLAGS=$FF_CFLAGS
    export AR="$AR"
    export LD="$LD"
    export AS="$AS"
    export NM="$NM"
    export RANLIB="$RANLIB"
    export STRIP="$STRIP"
    export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"

    ./Configure $OPENSSL_ARCH \
    --prefix=$PREFIX \
    no-engine \
    no-asm \
    no-threads \
    shared

    make clean
    make -j2
    make install

    cd ..

还有两个比较坑的点

  1. armv7架构下openssl依赖了libatomic,但是鸿蒙sdk里面没有提供这个库,所以我直接去改了openssl里面的配置,linux-armv4配置原本继承自linux-latomic,依赖了libatomic,直接改成继承linux-generic32,libatomic是一个多线程下保持原子性的库,所以需要加上no-threads禁用多线程。另外也可以自己去编译一个libatomic出来一起链接,这样就可以用多线程了

harmonyos openssl 编译,HarmonryOS,harmonyos,开源,华为,native,编译

  1. 默认配置编译出来的so库是带软链接,有so.x.y这种带版本号的命名,也需要在配置里面改一下

harmonyos openssl 编译,HarmonryOS,harmonyos,开源,华为,native,编译

最后把脚本文件放到openssl目录下执行编译就可以了,也可以再写一个脚本方便一次性编译所有架构文章来源地址https://www.toymoban.com/news/detail-781648.html

for arch in armeabi-v7a arm64-v8a
do
    bash build_openssl.sh $arch
done

到了这里,关于HarmonyOS编译开源native库(OpenSSL实例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • openssl+sha256开发实例(C++)

    SHA-256(Secure Hash Algorithm 256-bit)是一种哈希算法,属于 SHA-2(Secure Hash Algorithm 2)家族的一员。SHA-256 产生的哈希值是一个256位(32字节)的二进制数字,通常以64个十六进制字符的形式表示。 以下是 SHA-256 的一些关键特点和应用: 安全性: SHA-256 被广泛认为是安全的哈希算法

    2024年01月17日
    浏览(46)
  • openssl交叉编译 (ubuntu+arm)

    1.下载安装包  wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz 2.解压安装包 tar -zxvf openssl-1.1.1l.tar.gz 3.进入源码文件夹-修改编译器 CC=arm-linux-gnueabihf-gcc 4.配置编译参数 ./config no-asm -shared --prefix=/home/alientek/sp_test/openssl/sp_install 1)no-asm在交叉编译过程中不使用汇编代码代码加速编译

    2024年02月05日
    浏览(43)
  • Openssl+sm4开发实例(含源码)

    SM4(国密算法)是由中国国家密码管理局(State Cryptography Administration,SCA)提出的分组密码算法,是一种对称加密算法。它是中国国家商用密码算法,也是 ISO/IEC 标准(ISO/IEC 18033-3:2010)中的一部分。SM4 算法被广泛用于中国国内的商用加密应用中。 以下是 SM4 算法的主要特点

    2024年02月06日
    浏览(43)
  • 交叉编译arm程序,编译arm版本的openssl

    开局一个错: 显示没有GCC, 于是下载gcc; 下载gcc有问题: 发现是换源的问题,于是换源后继续安装,安装成功: 接着继续出错: 继续安装库sudo apt-get install libncurses5-dev 接着又报错了,我之前去的github上弄的buildroot,现在去官网下载一个。 果然运行成功了: Target options:

    2024年02月04日
    浏览(38)
  • iOS开发之编译OpenSSL静态库

    项目审查发现OpenSSL1.0.2d有漏洞,所以需要升级更新OpenSSL版本,借此机会,记录一下编译OpenSSL静态库的流程。 Xcode使用的是14.2,OpenSSL使用的是1.0.2u、1.1.1u,由于是对两个不同版本进行的编译操作,所以相关命令和操作方式是有区别的,我会在下面分别描写,操作时要看清对

    2024年02月07日
    浏览(45)
  • openssl+SM2开发实例一(含源码)

    SM2(国密算法2) 是中国国家密码管理局(CNCA)颁布的椭圆曲线密码算法标准,属于非对称加密算法。它基于椭圆曲线离散对数问题,提供了安全可靠的数字签名、密钥交换和公钥加密等功能。SM2被设计为适用于各种场景下的密码学应用,包括数字证书、数据加密、数字签名

    2024年02月04日
    浏览(40)
  • 无openssl编译libwebsockets源码(关闭SSL)

    编译源码,生成不依赖openssl的libwebsockets动态库(dll),操作系统为64位win10,需要提供32位的兼容版本。 选择libwebsockets版本为4.3,编译器为VS2017默认编译器,cmake3.26。 在cmake阶段通过LWS_WITH_SSL变量关闭libwebsockets的所有SSL功能。 0、安装cmake(略)。 1、在源代码main目录下(与i

    2024年02月14日
    浏览(36)
  • 鸿蒙引入 OpenSSL 库和 Poco 库(编译、调用)

    从 openHarmony SDK 官方发布渠道下载 SDK。 我下载的版本是 version-Master_Version-OpenHarmony_4.1.6.5_dev-20240127_020213-ohos-sdk-full.tar.gz 解压 SDK,得到 ohos_sdk 目录。可以看到 Linux 和 windows 两个平台的 SDK 目录,我们进入 Linux 目录。 解压 Linux 环境下的 OHOS SDK 工具包,得到对应工具目录。由

    2024年04月10日
    浏览(39)
  • 【OpenSSL 之一】OpenSSL初体验(编译安装、工作机制、Engine加载(afalg、cryptodev-linux)、offload等)

      OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现SSL协议。整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto。   OpenSSL项目是一个开放源代码安全项目,它的目标是开发

    2024年02月02日
    浏览(35)
  • Linux编译安装openssl 1.1.1s

      我的pc系统版本是Ubuntu 22.04.1 LTS,默认安装的是OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)。   但是种种原因需要安装1.1.1版本的 下载: 通过官网:https://www.openssl.org/source/openssl-1.1.1s.tar.gz 解压: 进入目录:  安装配置: /opt/ssl是安装的路径可以自己选 编译: 编译测

    2023年04月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包