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

104 篇文章 0 订阅
66 篇文章 0 订阅

往期知识点整理

场景描述

开发过程中可能需要在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; // 应用临时文件路径

备注:目前NDK并没有提供获取ApplicationContext的接口,无法直接获取应用沙箱路径。

方式二:拼接

根据应用沙箱目录的规范,在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 Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植……等)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

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

开发基础知识:

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

在这里插入图片描述

基于ArkTS 开发

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

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

在这里插入图片描述

OpenHarmony 开发环境搭建

图片

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值