当前位置: 首页 > article >正文

OHOS(HarmonyOS) 编译 C/C++ 库

1. OHOS(HarmonyOS) 编译 C/C++ 库

  • 1. OHOS(HarmonyOS) 编译 C/C++ 库
    • 1.1. HarmonyOS 简介
    • 1.2. harmon sdk 环境准备
      • 1.2.1. ets
      • 1.2.2. js
      • 1.2.3. native
      • 1.2.4. previewer
      • 1.2.5. toolchains
    • 1.3. linux下编译三方C/C++库
      • 1.3.1. cmake 编译
      • 1.3.2. configure 编译
      • 1.3.3. makefile 编译
    • 1.4. aki
    • 1.5. 参考文档

1.1. HarmonyOS 简介

本文主要介绍如何在 Linux 下使用 HarmonyOS SDK, 为 OHOS(HarmonyOS 简称 OHOS) 编译 C/C++ 库

harmonyOS 使用 ArkTS 语音,ArkTS 是 TS(TypeScript)的超级,TS是 JS(JavaScript) 的超集。简单来说,ArkTS 是 JS 语法的扩展,如果你熟悉 JS,那么学习 ArkTS 会非常容易。

1.2. harmon sdk 环境准备

  1. 下载HarmonyOS SDK, https://ci.openharmony.cn/workbench/closerelease/sdk
    1. 下载 ohos-sdk-full.tar.gz 即可,里边包含 window 和 linux 的库
    2. mac 下载 ohos-sdk-mac-full.tar.gz 包
    3. 我下载的是 3.1.6版本,2023年1月30日发布(此版本编译aki会报错,找不到 unordered_map)
    4. 最新版本可以从 https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes 的镜像站点获取
  • SDK 分为两个版本 full 版本和 public 版本, 这两个版本的 SDK 中关于 c/c++ 编译的部分是相同的,full 版本的 SDK 在 ets 层提供了更多的 API
  • 解压 ohos-sdk-full.tar.gz 后,得到 ohos-sdk 目录,里面包含了 linux 和 windows 的 SDK, 解压linux中的压缩包,结果如下
➜  ohos-sdk git:(master) ✗ tree -L 2
.
├── linux
│   ├── ets
│   ├── ets-linux-3.1.12.5-Release.zip
│   ├── js
│   ├── js-linux-3.1.12.5-Release.zip
│   ├── native
│   ├── native-linux-3.1.12.5-Release.zip
│   ├── previewer
│   ├── previewer-linux-3.1.12.5-Release.zip
│   ├── toolchains
│   └── toolchains-linux-3.1.12.5-Release.zip
└── windows
    ├── ets-windows-3.1.12.5-Release.zip
    ├── js-windows-3.1.12.5-Release.zip
    ├── native-windows-3.1.12.5-Release.zip
    ├── previewer-windows-3.1.12.5-Release.zip
    └── toolchains-windows-3.1.12.5-Release.zip

7 directories, 10 files

1.2.1. ets

ets 目录主要与 eTS(HarmonyOS eXtended TypeScript)开发相关,eTS 是 OpenHarmony 推荐的开发语言。

1.2.2. js

js 目录用于支持 JavaScript 开发,尽管 OpenHarmony 更推荐使用 eTS,但仍保留对 JavaScript 的支持。

1.2.3. native

编译 C/C++ 代码需要的文件夹,主要包含 Clang 等编译工具

➜  native git:(master) ✗ tree -L 1
.
├── build                               # 目录存放的是 构建时 cmake 依赖的配置文件,比如 cmake/ohos.toolchain.cmake, cmake 编译三方库时使用
├── build-tools                         # 目录存放的是 构建工具包含 cmake 和 ninja,我们后面采用 make 进行构建。
├── docs                                # 目录存放 使用说明
├── llvm                                # 目录存放 clang 编译器, configure/makefile 等编译工具使用
├── nativeapi_syscap_config.json        # 记录 SDK 提供的能力对应的头文件
├── ndk_system_capability.json          # 记录记录 SDK 提供的能力
├── NOTICE.txt                          # 为注意事项,内容多为 SDK 的详细描述
├── oh-uni-package.json                 # 为 SDK 信息描述,如版本
└── sysroot                             # 目录为编译器的 sysroot 目录,存放 SDK 内部的已经包含的库和对应的头文件

5 directories, 4 files

1.2.4. previewer

previewer 指的是预览器,它为开发者提供了在开发环境中快速预览应用界面效果的能力,无需将应用部署到实际设备或模拟器上

1.2.5. toolchains

tools 目录包含了开发、调试和打包 OpenHarmony 应用所需的各种工具。

1.3. linux下编译三方C/C++库

  1. 准备环境,详见上文
  2. 下载要编译的三方库源码
  3. 开始编译(根据源码,有多种编译方式,详见下文)

1.3.1. cmake 编译

参考 https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.md

  • 这是官方推荐的编译方式,也是最常用最简单的方式
  • 和标准的 cmake 编译方式类似,只是需要制定一些额外的参数
    • OHOS_STL libc++的链接方式,由于C++运行时中存在一些全局变量,因此同一应用中的全部Native库需要采用相同的链接方式。
      • c++_shared (默认)
      • c++_static
    • OHOS_ARCH
      • x86_64 (默认)
      • armeabi-v7a
      • arm64-v8a
    • OHOS_PLATFORM=OHOS
    • CMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake

举例如下:

OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux 
PATH=${OHOS_SDK}/native/build-tools/cmake/bin:$PATH
which cmake

rm -rf build
mkdir build
cmake -DOHOS_STL=c++_shared -DOHOS_ARCH=armeabi-v7a -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake -B build
cmake --build build

举例

git clone https://github.com/DaveGamble/cJSON.git -b v1.7.15
cd cJSON
OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux
${OHOS_SDK}/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake  -B build
cmake --build build

1.3.2. configure 编译

参考 https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.md

# aarch64-linux-ohos
export OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录

export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos"
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export CFLAGS="-fPIC -D__MUSL__=1"
export CXXFLAGS="-fPIC -D__MUSL__=1"
export HOST_TAG=aarch64-linux
# linux-arm
export OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录

export CC="${OHOS_SDK}/native/llvm/bin/clang --target=arm-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=arm-linux-ohos"
export CFLAGS="-fPIC -march=armv7a -D__MUSL__=1"
export CXXFLAGS="-fPIC -march=armv7a -D__MUSL__=1"

export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export HOST_TAG=arm-linux
# 设置好上边编译参数之后,只要按照标准的 configure 用法即可.
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz
tar xvf ${src_pkg}
cd libsodium-1.0.18
install_dir=/tmp/${HOST_TAG}
./configure --host=${HOST_TAG} --prefix=${install_dir}
make && make install
file ${install_dir}/lib/*
cd -

1.3.3. makefile 编译

具体可参考 configure 编译

1.4. aki

https://gitee.com/openharmony-sig/aki

AKI (Alpha Kernel Interacting) 是一款边界性编程体验友好的ArkTs FFI开发框架,针对OpenHarmony Native开发提供JS与C/C++跨语言访问场景解决方案。支持极简语法糖使用方式,一行代码完成JS与C/C++的无障碍跨语言互调,所键即所得。
可以实现 C/C++ 调用 JS,JS 调用 C/C++

1.5. 参考文档

  • release-sdk
  • OpenHarmony Linux 环境 SDK 使用说明
  • 知识地图
  • 5.0.0(12)- API 12 Release
  • 5.0.1(13)- API 13 Release
  • JNI与NDK有何不同
  • lycium 交叉编译框架

http://www.kler.cn/a/539052.html

相关文章:

  • JS对象拷贝的几种实现方法以及如何深拷贝(面试题)
  • 【C++】 STL -- 算法(二)
  • MySQL下载过程
  • Oracle数据连接 Dblink
  • 嵌入式AI革命:DeepSeek开源如何终结GPU霸权,开启单片机智能新时代?
  • trimesh 加载obj mesh处理
  • 使用Termux和Ollama在Android设备上构建与运行AI模型
  • 本地部署DeepSeek方法记录
  • DeepSeek R1蒸馏版模型部署的实战教程
  • 【C语言标准库函数】浮点数分解与构造: frexp() 和 ldexp()
  • 35~37.ppt
  • linux openssl 版本管理:不要手动更新系统的openssl版本
  • Win11经典开始菜单增强工具
  • Jenkins 自动化测试
  • 游戏引擎学习第92天
  • 基于STM32HAL库的万年历系统
  • 【开源免费】基于SpringBoot+Vue.JS乐享田园系统(JAVA毕业设计)
  • 数据库创库建表处理
  • 人工智能-A*算法与卷积神经网络(CNN)结合实现路径规划
  • 四边形网格处理——沿Edge遍历 矩形域顶点提取
  • TestContext 框架核心机制详解
  • PHP中的魔术方法
  • 激活函数和激活函数汇总
  • 滑动窗口核心算法解决字符串问题(最小覆盖子串/字符串排列/异位词/最长无重复子串)
  • [vue3] Ref Reactive
  • 如何在Python中使用内置函数