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这些。

build_config.sh

bash 复制代码
 #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文件里面,可以按需要配置

build_openssl.sh

bash 复制代码
  #!/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出来一起链接,这样就可以用多线程了
  1. 默认配置编译出来的so库是带软链接,有so.x.y这种带版本号的命名,也需要在配置里面改一下

最后把脚本文件放到openssl目录下执行编译就可以了,也可以再写一个脚本方便一次性编译所有架构

bash 复制代码
for arch in armeabi-v7a arm64-v8a
do
    bash build_openssl.sh $arch
done
相关推荐
CoderJia程序员甲1 小时前
GitHub 热榜项目 - 日榜(2025-08-16)
人工智能·ai·开源·github
whysqwhw2 小时前
鸿蒙分布式投屏
harmonyos
whysqwhw3 小时前
鸿蒙AVSession Kit
harmonyos
whysqwhw5 小时前
鸿蒙各种生命周期
harmonyos
whysqwhw6 小时前
鸿蒙音频编码
harmonyos
whysqwhw6 小时前
鸿蒙音频解码
harmonyos
whysqwhw6 小时前
鸿蒙视频解码
harmonyos
whysqwhw6 小时前
鸿蒙视频编码
harmonyos
ajassi20006 小时前
开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器
华为·开源·harmonyos
前端世界7 小时前
在鸿蒙应用中快速接入地图功能:从配置到实战案例全解析
华为·harmonyos