鸿蒙开发实践——基于C++能力的资源访问

HarmonyOS 开发实践——基于C++能力的资源访问 根据应用沙箱目录的 规范 ,在Native C++侧定义完整的沙箱路径。如:/data/app/el2/100/base/{包名}/haps/entry/files/test.txt。在ApplicationContext对象中获取应用沙箱路径,传递应用沙箱路径到Native C++侧。参考场景一的使用C++标准的文件接口打开文件,path传入对应文件所在的沙箱路径。方式一:通过arkts侧传递。 阅读详情

场景描述

开发过程中可能需要在native侧实现资源访问,应用经常会遇到如下的业务诉求:

  • 场景一:c++访问公共目录的文件图片等资源(图库和文管)

  • 场景二:c++访问沙箱文件/图片等资源

  • 场景三:c++访问应用包里的文件/图片资源 rawfile和resource

场景一:c++访问公共目录的文件图片等资源(图库和文管)

一、获取拥有读/写权限的文件URI,当前需要在arkts侧获取并通过NAPI的方式将uri传递给C++侧,如通过picker获取对应uri,再将uri传递到c++侧。

二、使用FileManagement_ErrCode OH_FileUri_GetPathFromUri根据uri获取对应的文件路径。

//将传入的uri转换成路径path。
FileManagement_ErrCode OH_FileUri_GetPathFromUri (const char * uri, unsigned int length, char ** result )

三、使用C++标准的文件接口打开文件。

fp = fopen(path, "r");

场景二:c++访问沙箱文件/图片等资源

一、获取沙箱路径

方式一:通过arkts侧传递

在应用arkts侧,提供了ApplicationContext对象,可获取沙箱路径:

应用arkts侧

在ApplicationContext对象中获取应用沙箱路径,传递应用沙箱路径到Native C++侧。

let applicationContext = getContext().getApplicationContext(); // 获取应用上下文对象
let filesDir = applicationContext.filesDir; // 应用通用文件路径
let cacheDir = applicationContext.cacheDir; // 应用缓存文件路径
let tempDir = applicationContext.tempDir; // 应用临时文件路径

方式二:拼接

根据应用沙箱目录的 规范 ,在Native C++侧定义完整的沙箱路径。如:/data/app/el2/100/base/{包名}/haps/entry/files/test.txt

二、根据沙箱路径打开文件/图片等资源

参考场景一的使用C++标准的文件接口打开文件,path传入对应文件所在的沙箱路径。

fp = fopen(path, "r");

场景三:c++访问应用包里的文件/图片资源(rawfile和resource)

一、js侧传入对应的资源管理对象resourceManager

获取本应用包资源resourceManager对象的示例如下:

private resmgr = getContext().resourceManager;  // 获取本应用包的资源对象

二、获取文件/资源路径一般是由开发者自行规划的,可由开发者自行拼接。在传递ResourceManger的同时传递了对应的文件夹名称。

let rawfilelist = testNapi.getFileList(this.resmgr, "rawdir"); //传入资源对象,以及访问的rawfile文件夹名称

三、C++侧访问rawfile和resource下的资源文件

通过arkts传入的resourceManager访问资源文件,整个过程按照以下步骤进行:

1、初始化resourceManager2、打开rawfile文件初始化:

NativeResourceManager *manager = OH_ResourceManager_InitNativeResourceManager(env, args[0]);

为使用OH_ResourceManager_OpenRawFile打开rawfile文件(mNativeResMgr为js传入的resourceManager):

RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
if (rawFile != nullptr) {
  OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
}

使用OH_ResourceManager_GetRawFileSize获取rawfile大小并申请内存:

long len = OH_ResourceManager_GetRawFileSize(rawFile);
std::unique_ptr<uint8_t[]> data= std::make_unique<char[]>(len);

读取rawfile:方式一:使用OH_ResourceManager_ReadRawFile一次性读取rawfile全部内容:

int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len);

方式二:使用OH_ResourceManager_ReadRawFile多次部分读取rawfile, 每次读取100 Byte。获取全部内容:

long offset = 0;
while (OH_ResourceManager_GetRawFileRemainingLength(rawFile) > 0) {
  OH_ResourceManager_ReadRawFile(rawFile, data.get() + offset, 100);
  offset += 100;
}

使用OH_ResourceManager_CloseRawFile关闭打开的指针对象:

OH_ResourceManager_CloseRawFile(rawFile);
OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);

转为arkts对象(可以根据这个arkts对象在arkts侧调用):

return CreateJsArrayValue(env, data, len);
鸿蒙HarmonyOS应用开发之C/C++标准库机制概述 OpenHarmony NDK提供业界标准库 libc标准库、 C++标准库 ,本文用于介绍C/C++标准库在OpenHarmony中的机制,开发者了解这些机制有助于在NDK开发过程中避免相关问题。 阅读详情

相关推荐

OpenHarmony 鸿蒙OS C++编程规范

https://gitee.com/openharmony/docs/blob/master/contribute/OpenHarmony-cpp-coding-style-guide.md C++语言编程规范 目的 规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”, 如果在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。  参考该规范之前,希望您具有相应的C++语言基础能力,而不是通过该文档来学习C+

WSG的博客--盛年不重来,一日难再晨.及时当勉励,岁月不待人. 6283

详细教程 - 进阶版 鸿蒙harmonyOS应用 第十五节——鸿蒙C++面向对象开发详解

面向对象编程(OOP)是一种程序设计思想,相比面向过程编程,它具有封装、继承、多态等特性,可以更好地抽象化复杂问题,并提高代码的复用性与维护性。在鸿蒙HarmonyOS系统开发中,C++作为主要编程语言,同样贯彻了面向对象的设计理念。正确运用各种面向对象技术,能够建立灵活稳定的系统架构,构建易维护、易扩展的应用程序。面向对象技术是现代程序设计的主流思想,在鸿蒙开发中有着广泛的运用。本文主要介绍了类与对象、封装、继承、多态等面向对象的核心概念,通过大量直观示例加深了理解。

爱蹦跶的全栈大A阿 3344

鸿蒙(HarmonyOS)实战开发篇——基于C++能力的资源访问

获取拥有读/写权限的文件URI,当前需要在arkts侧获取并通过NAPI的方式将uri传递给C++侧,如通过picker获取对应uri,再将uri传递到c++侧。

lc748258的博客 1316

鸿蒙OS开发实例:【Native C++】

本篇Codelab主要介绍如何使用DevEco Studio创建一个Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平方根。在输入框中输入两个数字,点击计算结果按钮显示计算后的数值。

鸿蒙的技术博客 5049

【鸿蒙实战开发】基于C++能力的资源访问

开发过程中可能需要在native侧实现资源访问,应用经常会遇到如下的业务诉求: 场景一:c++访问公共目录的文件图片等资源(图库和文管) 场景二:c++访问沙箱文件/图片等资源 场景三:c++访问应用包里的文件/图片资源 rawfile和resource

CTrup的博客 917

HarmonyOS 实战开发 —— 基于C++能力的资源访问

根据应用沙箱目录的 规范 ,在Native C++侧定义完整的沙箱路径。如:/data/app/el2/100/base/{包名}/haps/entry/files/test.txt。在ApplicationContext对象中获取应用沙箱路径,传递应用沙箱路径到Native C++侧。参考场景一的使用C++标准的文件接口打开文件,path传入对应文件所在的沙箱路径。方式一:通过arkts侧传递。

CTrup的博客 793

【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇

本篇博客主要介绍了华为的鸿蒙系统(HarmonyOS4.0)的发布,三大特征,技术架构,技术特性

“路漫漫其修远兮,吾将上下求索。” 2万+

【鸿蒙开发】HarmonyOS 模块关系梳理

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。随着鸿蒙的不断发展以及国家的大力支持,未来鸿蒙职位肯定会迎来一个大的爆发,只有积极应对变化,不断学习和提升自己,我们才能在这个变革的时代中立于不败之地。

HarmonyOS_001的博客 3084

鸿蒙系统概述(HarmonyOS)

系统定义、技术特征、系统安全。目录鸿蒙系统概述(HarmonyOS)系统定义系统定位技术架构内核层系统服务层框架层应用层技术特性硬件互助,资源共享一次开发,多端部署统一OS,弹性部署系统安全正确的人正确的设备正确地使用数据系统定位HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。

2302_80826162的博客 2799

鸿蒙OH实战开发:基于C++能力的资源访问

根据应用沙箱目录的 规范 ,在Native C++侧定义完整的沙箱路径。如:/data/app/el2/100/base/{包名}/haps/entry/files/test.txt。在ApplicationContext对象中获取应用沙箱路径,传递应用沙箱路径到Native C++侧。参考场景一的使用C++标准的文件接口打开文件,path传入对应文件所在的沙箱路径。方式一:通过arkts侧传递。

liuhaojiabin的博客 831

HarmonyOS 鸿蒙开发DevEco Studio:Java和C/C++跨语言调试

在HarmonyOS应用/服务开发中,通常会涉及到使用C/C++和Java语言同时开发的场景,一般使用C/C++来开发应用/服务的性能要求较高的部分功能、或Native平台迁移代码,使用Java开发应用/服务的逻辑。针对这种场景,DevEco Studio提供了C/C++/Java跨语言的调试功能,包括C/C++和Java断点的管理、调试信息的展示、单步调试等能力,方便开发者快速发现并解决Java调用C/C++相关代码的问题。启动调试,可能应用/服务的启动速度较慢。启动应用/服务,再通过。

斌擎科技 1444

HarmonyOS APP 开发入门

本文讲解了入门基于HarmonyOS 的移动开发的一些基本知识和操作讲解

itcyy的博客 1万+

从原理图到GDSII:Virtuoso+Pcell实战避坑指南(以TSMC65nm振荡器为例)

本文以TSMC65nm工艺下的振荡器设计为例,详细解析了Virtuoso环境中Pcell的最佳实践方案,涵盖变量管理、版图设计、Calibre验证等关键环节。通过实战案例和避坑指南,帮助工程师高效完成从原理图到GDSII的转化,特别针对LVS验证和参数化单元设计提供了实用解决方案。

fff88的博客 898

【HarmonyOS鸿蒙开发技术】鸿蒙系统(HarmonyOS)鸿蒙开发入门篇

本文系统介绍了鸿蒙操作系统(HarmonyOS)开发技术体系。鸿蒙作为面向全场景的分布式操作系统,其核心技术包括分布式计算、声明式UI、跨设备协同等。文章从五个层次详细解析了鸿蒙开发技术:内核与系统服务层、应用框架层、开发语言层、开发工具链和生态能力层。重点阐述了应用开发核心技术(Ability组件、状态管理、UI开发等)、系统能力调用(服务访问、设备能力调用)以及开发工具链(DevEcoStudio等)。文章还提供了从入门到精通的技术学习路径规划,帮助开发者建立完整的鸿蒙开发技术体系认知,为开发全场景智能

2501_93196106的博客 2686

全自动数据分析 - Claude Code Sub-Agents:自动化数据分析工厂

别忘了!claude code也是agent框架,类似langgraph,crewAI,autogen等等agent框架。我改造claude code搞一个数据分析智能体AI。试试看行不行!:让数据分析变得像聊天一样简单!

liangdabiao的博客 1072

79.ScottPlot的MVVM实现 C#例子 WPF例子

在你的 WPF 窗口的 XAML 文件中,定义一个,并将其Content属性绑定到 ViewModel 中的属性。这样可以将WpfPlot控件动态绑定到 ViewModel。

S13461120713的博客 2568

鸿蒙系统概述(HarmonyOS)学习这一篇就够了!

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、AR/VR眼镜等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体娱乐等)业务能力。

Z_CH8648的博客 2万+

SAP ABAP干货:用REUSE_ALV_GRID_DISPLAY_LVC实现ALV多屏幕独立布局(含handle参数详解)

本文详细解析了SAP ABAP中如何使用REUSE_ALV_GRID_DISPLAY_LVC函数实现ALV多屏幕独立布局,重点介绍了handle参数的技术原理和实际应用。通过变式标识符和LTDX表存储机制,开发者可以确保不同ALV报表屏幕的布局设置互不干扰,提升复杂报表场景下的用户体验。

weixin_29268267的博客 308
上一篇: 鸿蒙开发实践——对各种图片编解码格式的支持
下一篇: 鸿蒙开发实践——基于Drawing的图形/文字绘制及双缓冲模拟实现刷新
猫猫码代码
博客等级 码龄6年 421粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值