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

络腮胡菲菲  金牌会员 | 2024-6-21 19:43:10 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 839|帖子 839|积分 2517

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库之间的调用,如图所示,具体规则为

  • default ns和ndk ns可以互相访问全部so,不能访问app ns的so。
  • 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。
  1. SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  2. 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


  • 基本概念
  • 构建第一个ArkTS应用
  • ……

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


  • 应用基础知识
  • 设置文件
  • 应用数据管理
  • 应用安全管理
  • 应用隐私掩护
  • 三方应用调用管控机制
  • 资源分类与访问
  • 学习ArkTS语言
  • ……

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


  • Ability开发
  • UI开发
  • 公共事件与通知
  • 窗口管理
  • 媒体
  • 安全
  • 网络与链接
  • 电话服务
  • 数据管理
  • 后台任务(Background Task)管理
  • 设备管理
  • 设备使用信息统计
  • DFX
  • 国际化开发
  • 折叠屏系列
  • ……

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


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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表