在 HarmonyOS(鸿蒙系统)和 OpenHarmony 的原生开发(C/C++ NDK 开发)中,系统提供了丰富的动态链接库(Dynamic Linked Libraries)。
动态链接库
鸿蒙的系统级动态库主要涵盖了 ArkTS/JS 交互、UI 渲染、图形图像、多媒体、数据存储、底层基础通信** 等模块。
以下是常用且核心的系统级动态链接库分类及功能介绍:
核心与语言绑定层 (Core & Language Bindings)
这些库是 Native 开发最基础的依赖,主要用于跨语言交互和底层系统调用。
libace_napi.z.so (Node-API / NAPI)- 作用: 负责 ArkTS/JS 与 C/C++ 之间的相互调用。几乎所有需要将 C/C++ 暴露给前端的代码都需要链接此库。
- 作用: 原生日志打印库。提供了
OH_LOG_Print 等接口,用于在 C/C++ 层输出日志到系统的 Hilog 中。
libc.so / libc++.so / libm.so- 作用: 标准的 C 库、C++ 标准库和数学库(这些通常是标准的
.so 后缀,遵循 POSIX 标准)。
UI 与应用框架层 (UI & Framework)
用于在 C/C++ 层直接控制 UI 组件或访问应用资源。
libace_ndk.z.so (ArkUI NDK)- 作用: 提供了 ArkUI 的 C 语言 API。允许开发者在纯 C/C++ 层创建、更新和销毁 ArkUI 组件,实现高性能的自定义 UI 控制(HarmonyOS NEXT 引入的重要特性)。
libohinputmethod.so (IME Kit)- 作用: IME Kit 负责建立编辑框所在应用与输入法应用之间的通信通道,确保两者可以共同协作提供文本输入功能,也为系统应用提供管理输入法应用的能力。。
- 作用: 提供读取应用安装包(HAP)内
rawfile 目录下原生资源文件的能力。常用于游戏引擎或播放器读取本地资产。
- 作用: 包管理 NDK 接口,用于在 Native 层获取应用的包信息、应用版本等。
图形与窗口系统 (Graphics & Windowing)
图形渲染和游戏开发的核心库。
- 作用: 提供原生窗口(Native Window)的管理能力。通常与 XComponent 结合使用,为 EGL/Vulkan 提供渲染表面(Surface)。
- 作用: 鸿蒙原生的 2D 绘制引擎(基于 Skia 封装),提供高性能的 2D 图形、文本绘制能力。
- 作用: 提供获取系统垂直同步信号(Vsync)的能力,用于实现平滑的动画和渲染帧率控制。
libEGL.so / libGLESv2.so / libGLESv3.so / libvulkan.so
多媒体与相机 (Media & Camera)
音视频处理和硬件访问。
- 作用: 鸿蒙原生的音频处理 NDK(OHAudio),提供低延迟的音频采集和播放能力(推荐替代老旧的 OpenSLES)。
- 作用: 相机 NDK,允许在 C/C++ 层直接控制相机硬件、配置流数据、获取预览帧等。
libnative_media_core.so (媒体核心基础类型)libnative_media_vdec.so / libnative_media_venc.so (视频硬件编解码)libnative_media_avmuxer.so / libnative_media_avdemuxer.so (音视频封装/解封装)
数据存储与共享 (Data & Storage)
- 作用: 关系型数据库(Relational Database)的 Native 接口。允许 C/C++ 代码直接执行 SQL 语句,进行高效的本地数据持久化。
- 作用: 用户首选项(Preferences)的 Native 接口,用于存储轻量级的 Key-Value 数据。
设备与传感器 (Device & Sensors)
- 作用: 提供在 Native 层访问设备传感器(如加速度计、陀螺仪、环境光等)的能力。
(注:HarmonyOS 系统的动态库通常带有 .z.so 后缀表示经过 zlib 压缩优化,部分标准通用库保留 .so 后缀。在 CMake 配置中一般直接写库名即可)
如何在开发中使用它们?
如果你想在纯血鸿蒙应用中知道到底有哪些 .so 可以用,可以通过以下方式查看: 在 DevEco Studio 安装目录的鸿蒙 SDK 路径下:[SDK路径]/default/openharmony/native/sysroot/usr/lib/[架构(如aarch64-linux-ohos)]/
在这个目录中,你能看到所有官方公开给 NDK 开发者的动态链接库。
使用示例(CMakeLists.txt):
如果你在写一个同时需要与 ArkTS 交互、打印日志、并读取 Rawfile 的原生模块,你的 CMakeLists.txt 会这样写:
# 找到或者直接链接系统库target_link_libraries(my_native_lib PUBLIC libace_napi.z.so libhilog_ndk.z.so librawfile.z.so libc++.so)
总结
很多人觉得 HarmonyOS / OpenHarmony 原生开发难,是因为代码底层、接口多、工程复杂。但实际上,真正让人迷糊的,往往不是代码本身,而是:对系统能力边界还没有建立起完整认知。
当你知道每个 so 是干什么的、为什么要链接、运行时由谁提供,原生开发就不再神秘。它并不是更难,只是比上层开发更接近系统。
参考资料
- HarmonyOS指南>NDK开发>NDK开发导读 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ndk-development-overview