鸿蒙HarmonyOS应用开发之C/C++标准库机制概述

OpenHarmony NDK提供业界标准库 libc标准库、 C++标准库 ,本文用于介绍C/C++标准库在OpenHarmony中的机制,开发者了解这些机制有助于在NDK开发过程中避免相关问题。

1. C++兼容性

在OpenHarmony系统中,系统库与应用Native库都在使用C++标准库(参考 libc++版本 ),系统库依赖的C++标准库随镜像版本升级,而应用Native库依赖的C++标准库随编译使用的SDK版本升级,两部分依赖的C++基础库会跨多个大版本,产生ABI兼容性问题。为了解决此问题,OpenHarmony上把两部分依赖的C++标准库进行了区分。

  • 系统库:使用libc++.so, 随系统镜像发布。
  • 应用Native库:使用libc++_shared.so,随应用发布。

两个库使用的C++命名空间不一样,libc++.so使用__h作为C++符号的命名空间,libc++_shared.so使用__n1作为C++符号的命名空间。

注意:系统和应用使用的C++标准库不能进行混用,Native API接口当前只能是C接口,可以通过这个接口隔离两边的C++运行环境。因此在使用共享库HAR包构建应用时,如果HAR包含的libc++_shared.so不同于应用使用的libc++_shared.so版本,那么只有其中一个版本会安装到应用里,可能会导致不兼容问题,可以使用相同的SDK版本更新HAR包解决此问题。

已知C++兼容性问题:应用启动或者dlopen时hilog报错symbol not found, s=__emutls_get_address,原因是OpenHarmony 3.2及之前版本SDK中的libc++_shared.so无此符号,而OpenHarmony4.0之后版本SDK的libc++_shared.so是有此符号的。解决此问题需要更新应用或者共享库HAR包的SDK版本。

2. musl libc动态链接器

2.1 动态库加载命名空间隔离

动态库加载命名空间(namespace,下面统称为ns)是动态链接器设计的一个概念(区别于C++语言中的命名空间),其设计的主要目的是为了在进程中做native库资源访问的管控,以达到安全隔离的目的。例如系统native库允许加载系统目录(/system/lib64;/vendor/lib64等)下的native库,但是普通应用native库仅允许加载普通应用native库和ndk库,而不允许直接加载系统native库。

动态链接器无论是在加载编译依赖(DT_NEEDED)中指定的共享库,还是调用dlopen加载指定的共享库,都需要关联到具体的ns。

OpenHarmony中动态库加载namespace配置的情况

  • default ns:动态链接器启动时默认创建的ns,它可以搜索/system/lib{abi};/vendor/lib{abi}等系统目录路径下的so。
  • ndk ns:动态链接器启动时默认创建的ns,它可以搜索/system/lib{abi}/ndk目录下的so,主要是暴露了NDK接口的so。
  • app ns: 应用启动时创建的ns,它的搜索路径一般是应用的安装路径(可能为沙箱路径),即可加载应用的so。

当前这一套命名空间机制主要限制了应用native库和系统native库之间的调用,如图所示,具体规则为

  1. default ns和ndk ns可以互相访问全部so,不能访问app ns的so。
  2. app ns能访问ndk ns的全部so,不能访问default ns的so。

2.2 rpath机制

rpath(run-time path)是在运行时指定共享库搜索路径的机制。该机制允许在可执行文件或共享库中嵌入一个用于在运行时指定库的搜索路径的信息。

由于上文介绍的命名空间隔离机制,应用仅允许加载对应安装目录拼接native库路径下(例如arm64平台上为libs/arm64)的应用native库,当应用程序涉及加载较多的native库,期望创建多个native库加载路径方便管理,但是会导致无法加载新创建目录下的native库,这种情况可以通过rpath机制编译时指定搜索路径。

例如,应用安装目录lib/arm64下的libhello.so依赖新创建路径lib/arm64/module下的libworld.so,那么在应用的CMakeList.txt里设置上rpath编译选项后编译,使用readelf查看libhello.so的rpath配置如图所示,$ORIGIN为libhello.so所在路径,运行时即可正常加载module目录下的libworld.so。

SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "\${ORIGIN}/module")

2.3 支持dlclose

支持使用dlclose真实卸载动态库的能力。

2.4 支持symbol-version机制

symbol-version是libc在动态链接-符号重定位阶段的符号检索机制,支持不同版本的符号重定位,也可以帮助解决重复符号的问题。可参考 LD Version Scripts (GNU Gnulib)

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

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

相关文章

集成学习 | 集成学习思想:Stacking思想

目录 一. Stacking 思想 一. Stacking 思想 Stacking(或stacked generalization),是指训练一个模型用于组合(combine)其他各个模型 Stacking有两层第一层是不同的基学习器(classifiers/regressors)第二层是用于组合基学习器的元学习&#xf…

mysql如何存Emoji表情

如何存Emoji表情 背景解决方案一: 如果是自己搭建的数据库,参考如下。 1:先创建数据库,utf8编码2: 修改mysql 的配置文件 /etc/my.cnf 文件3:然后把你的表和字段也要支持utf8md4编码4:修改你连…

鸿蒙开发-UI-交互事件-手势事件

鸿蒙开发-UI-图形-绘制自定义图形 鸿蒙开发-UI-图形-页面内动画 鸿蒙开发-UI-图形-组件内转场动画 鸿蒙开发-UI-图形-弹簧曲线动画 鸿蒙开发-UI-交互事件-通用事件 鸿蒙开发-UI-交互事件-键鼠事件 鸿蒙开发-UI-交互事件-焦点事件 文章目录 前言 一、绑定手势方法 1. gesture …

智能算法-遗传算法 学习笔记

适应度的计算可类别为神经网络的目标函数,但此算法属于无监督学习,宏观来讲为搜寻最优解(梯度)的方式不同? 但神经网络中好像并不存在变异操作(参数矩阵突变)? 交叉的话残差网络ResN…

竞赛 python+opencv+机器学习车牌识别

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器学习的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖,适…

为什么上级总能提出问题和风险

首先要搞清楚什么是风险,风险就是目标与实际的GAP,所谓能发现风险就是对目标的理解更深入,对目标的实现具有更高要求,GAP越大能发现的风险越多 💡目标不同: 1.高层领导关注长期指标,比如他会看…

【Java面试题】计算机网络

文章目录 1.计算机网络基础1.1网络分层模型/OSI七层模型是什么?1.2TCP/IP四层模型是什么?每一层的作用?1.2.1TCP四层模型?1.2.2为什么网络要分层? 1.2常见网络协议1.2.1应用层常见的协议1.2.2网络层常见的协议 2.HTTP2…

OSCP靶场--Extplorer

OSCP靶场–Extplorer 考点(信息收集linux磁盘组用户提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.194.16 -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-26 20:21 EDT Nmap scan report for 19…

css预处理器scss的使用如何全局引入

目录 scss 基本功能 1、嵌套 2、变量 $ 3、mixin 和 include 4、extend 5、import scss 在项目中的使用 1、存放 scss 文件 2、引入 variables 和 mixins 2-1、局部引入 2-2、全局引入 3、入口文件中引入其他文件 项目中使用 css 预处理器,可以提高 cs…

第一个JDBC程序

一、JDBC的概念: JDBC 是 Java DataBase Connectivity (Java 数据连接)技术的简称,是一种可用于执行 SQL 语句的 Java API。它由一些 java 语言编写的类和接口组成;程序员通过使用 jdbc 可以方便地将 SQL 语句传送给几乎任何一种数据库。 二…

通过一篇文章让你了解C++是什么

C是什么 前言一、什么是C二、C的发展史三、C的重要性3.1 计算机语言的使用广泛度3.2 在工作领域3.3公司需求 四、公司是如何面试C的 前言 C是一种编程语言,它在20世纪80年代作为C语言的扩展而开发出来。它是一种编译型语言,这意味着用C编写的程序在执行…

可以放在桌面上使用的便签有哪款?怎么挑选桌面便签软件

在日常工作和生活中,一款能够放在桌面使用的便签软件,无疑会极大地提升我们的工作效率和便捷性。那么,网上究竟有哪些值得推荐的桌面便签app呢?今天,我要为大家介绍一款既实用又便捷的桌面便签软件——敬业签。 这款软…