鸿蒙HarmonyOS应用开辟之Rawfile开辟指导

打印 上一主题 下一主题

主题 847|帖子 847|积分 2541

场景介绍

开辟者可以通过本指导了解在OpenHarmony应用中,如何利用Native Rawfile接口操纵Rawfile目次和文件。功能包括文件列表遍历、文件打开、搜索、读取和关闭Rawfile。
接口阐明

接口名描述NativeResourceManager *OH_ResourceManager_InitNativeResourceManager(napi_env env, napi_value jsResMgr)初始化native resource manager。RawDir *OH_ResourceManager_OpenRawDir(const NativeResourceManager *mgr, const char *dirName)打开指定rawfile目次。int OH_ResourceManager_GetRawFileCount(RawDir *rawDir)获取指定rawfile目次下的rawfile文件数量。const char *OH_ResourceManager_GetRawFileName(RawDir *rawDir, int index)获取rawfile名字。RawFile *OH_ResourceManager_OpenRawFile(const NativeResourceManager *mgr, const char *fileName)打开指定rawfile文件。long OH_ResourceManager_GetRawFileSize(RawFile *rawFile)获取rawfile文件大小。int OH_ResourceManager_SeekRawFile(const RawFile *rawFile, long offset, int whence)指定rawfile内偏移量。long OH_ResourceManager_GetRawFileOffset(const RawFile *rawFile)获取rawfile偏移量。int OH_ResourceManager_ReadRawFile(const RawFile *rawFile, void *buf, size_t length)读取rawfile文件内容。int64_t OH_ResourceManager_GetRawFileRemainingLength(const RawFile *rawFile)获取rawfile文件剩余长度。void OH_ResourceManager_CloseRawFile(RawFile *rawFile)释放rawfile文件相干资源。void OH_ResourceManager_CloseRawDir(RawDir *rawDir)释放rawfile目次相干资源。bool OH_ResourceManager_GetRawFileDescriptor(const RawFile *rawFile, RawFileDescriptor &descriptor)获取rawfile的fd。bool OH_ResourceManager_ReleaseRawFileDescriptor(const RawFileDescriptor &descriptor)释放rawfile的fd。void OH_ResourceManager_ReleaseNativeResourceManager(NativeResourceManager *resMgr)释放native resource manager相干资源。 函数介绍


  • 根据NativeResourceManager实例,利用OH_ResourceManager_OpenRawDir接口获取RawDir实例。
  1. RawDir* rawDir = OH_ResourceManager_OpenRawDir(nativeResourceManager, path.c_str());
复制代码

  • 根据RawDir实例,利用OH_ResourceManager_GetRawFileCount接口获取对应目次下的rawfile文件总数 。
  1. int count = OH_ResourceManager_GetRawFileCount(rawDir);
复制代码

  • 根据RawDir实例,利用OH_ResourceManager_GetRawFileName接口获取目次下对应index的rawfile文件名。
  1. for (int index = 0; index < count; index++) {
  2.     std::string fileName = OH_ResourceManager_GetRawFileName(rawDir, index);
  3. }
复制代码

  • 根据NativeResourceManager实例,利用OH_ResourceManager_OpenRawFile接口获取指定文件名的RawFile实例
  1. RawFile* rawFile = OH_ResourceManager_OpenRawFile(nativeResourceManager, fileName.c_str());
复制代码

  • 根据RawFile实例,利用OH_ResourceManager_GetRawFileSize接口获取对应rawfile文件大小。
  1. long rawFileSize = OH_ResourceManager_GetRawFileSize(rawFile);
复制代码

  • 根据RawFile实例,利用OH_ResourceManager_SeekRawFile接口指定rawfile偏移量。
  1. int position = OH_ResourceManager_SeekRawFile(rawFile, 10, 0);
  2. int position = OH_ResourceManager_SeekRawFile(rawFile, 0 , 1);
  3. int position = OH_ResourceManager_SeekRawFile(rawFile, -10, 2);
复制代码

  • 根据RawFile实例,利用OH_ResourceManager_GetRawFileOffset接口获取rawfile偏移量。
  1. long rawFileOffset = OH_ResourceManager_GetRawFileOffset(rawFile)
复制代码

  • 根据RawFile实例,利用OH_ResourceManager_ReadRawFile接口读取rawfile文件内容。
  1. std::unique_ptr<char[]> mediaData = std::make_unique<char[]>(rawFileSize);
  2. long rawFileOffset = OH_ResourceManager_ReadRawFile(rawFile, mediaData.get(), rawFileSize);
复制代码

  • 根据RawFile实例,利用OH_ResourceManager_GetRawFileRemainingLength接口读取rawfile文件的剩余长度。
  1. int64_t rawFileRemainingSize = OH_ResourceManager_GetRawFileRemainingLength(rawFile);
复制代码

  • 根据RawFile实例,利用OH_ResourceManager_CloseRawFile接口释放rawfile文件相干资源。
  1. OH_ResourceManager_CloseRawFile(rawFile);
复制代码

  • 根据RawDir实例,利用OH_ResourceManager_CloseRawDir接口释放rawfile目次相干资源。
  1. OH_ResourceManager_CloseRawDir(rawDir);
复制代码

  • 根据RawFile实例,利用OH_ResourceManager_GetRawFileDescriptor接口获取rawfile的RawFileDescriptor。
  1. RawFileDescriptor descriptor;
  2. bool result = OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor);
复制代码

  • 根据RawFileDescriptor实例,利用OH_ResourceManager_ReleaseRawFileDescriptor接口关闭rawfile的fd。
  1. OH_ResourceManager_ReleaseRawFileDescriptor(descriptor);
复制代码

  • 根据NativeResourceManager实例,利用OH_ResourceManager_ReleaseNativeResourceManager接口释放native resource manager。
  1. OH_ResourceManager_ReleaseNativeResourceManager(nativeResourceManager);
复制代码
开辟步调

以ArkTS侧获取rawfile文件列表、rawfile文件内容、rawfile描述符{fd, offset, length}三种调用方式为例。
1. 创建工程

2. 添加依赖
创建完成后,IDE会在工程生成cpp目次,目次有libentry/index.d.ts、hello.cpp、CMakeLists.txt等文件。

  • 打开src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加资源的librawfile.z.so以及日志依赖libhilog_ndk.z.so。
  1. target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so librawfile.z.so)
复制代码

  • 打开src/main/cpp/types/libentry/index.d.ts文件,此文件声明了应用侧函数getFileList、getRawFileContent、getRawFileDescriptor。
  1. import resourceManager from '@ohos.resourceManager';
  2. export const getFileList: (resmgr: resourceManager.ResourceManager, path: string) => Array<String>;
  3. export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array;
  4. export const getRawFileDescriptor: (resmgr: resourceManager.ResourceManager, path: string) => resourceManager.RawFileDescriptor;  
复制代码
3. 修改源文件

  • 打开src/main/cpp/hello.cpp文件,文件Init会对当前方法进行初始化映射,这里界说对外接口为getFileList、getRawFileContent、getRawFileDescriptor,映射C++接口分别为GetFileList、GetRawFileContent、GetRawFileDescriptor。
  1. EXTERN_C_START
  2. static napi_value Init(napi_env env, napi_value exports)
  3. {
  4.     napi_property_descriptor desc[] = {
  5.         { "getFileList", nullptr, GetFileList, nullptr, nullptr, nullptr, napi_default, nullptr },
  6.         { "getRawFileContent", nullptr, GetRawFileContent, nullptr, nullptr, nullptr, napi_default, nullptr },
  7.         { "getRawFileDescriptor", nullptr, GetRawFileDescriptor, nullptr, nullptr, nullptr, napi_default, nullptr }
  8.     };
  9.     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
  10.     return exports;
  11. }
  12. EXTERN_C_END
复制代码

  • 把src/main/cpp/hello.cpp文件中,增加对应的三个方法,如下所示
  1. static napi_value GetFileList(napi_env env, napi_callback_info info)
  2. static napi_value GetRawFileContent(napi_env env, napi_callback_info info)
  3. static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)
复制代码

  • 在hello.cpp文件中获取Js的资源对象,并转为Native的资源对象,即可调用资源的Native接口,获取rawfile列表、rawfile文件内容以及rawfile描述符{fd, offset, length}三种调用方式示例代码如下:
  1. #include <rawfile/raw_file.h>#include <rawfile/raw_dir.h>#include <rawfile/raw_file_manager.h>// 示例一:获取rawfile文件列表 GetFileListstatic napi_value GetFileList(napi_env env, napi_callback_info info){    OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest Begin");    size_t requireArgc = 3;    size_t argc = 2;    napi_value argv[2] = { nullptr };    // 获取参数信息    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);    // argv[0]即为函数第一个参数Js资源对象,OH_ResourceManager_InitNativeResourceManager转为Native对象。    NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);    // 获取函数argv[1],此为为rawfile相对路径    size_t strSize;    char strBuf[256];    napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);    std::string dirName(strBuf, strSize);    // 获取对应的rawDir指针对象    RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str());    // 获取rawDir下文件及文件夹数量    int count = OH_ResourceManager_GetRawFileCount(rawDir);
  2.     // 遍历获取文件名称,并保存    std::vector<std::string> tempArray;    for(int i = 0; i < count; i++) {        std::string filename = OH_ResourceManager_GetRawFileName(rawDir, i);        tempArray.emplace_back(filename);    }    napi_value fileList;    napi_create_array(env, &fileList);    for (size_t i = 0; i < tempArray.size(); i++) {        napi_value jsString;        napi_create_string_utf8(env, tempArray[i].c_str(), NAPI_AUTO_LENGTH, &jsString);        napi_set_element(env, fileList, i, jsString);    }    // 关闭打开的指针对象    OH_ResourceManager_CloseRawDir(rawDir);
  3.     OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);    return fileList;}// 示例二:获取rawfile文件内容 GetRawFileContentnapi_value CreateJsArrayValue(napi_env env, std::unique_ptr<uint8_t[]> &data, long length){    napi_value buffer;    napi_status status = napi_create_external_arraybuffer(env, data.get(), length,            [](napi_env env, void *data, void *hint) {                delete[] static_cast<char*>(data);            }, nullptr, &buffer);    if (status != napi_ok) {        OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create external array buffer");        return nullptr;    }    napi_value result = nullptr;    status = napi_create_typedarray(env, napi_uint8_array, length, buffer, 0, &result);    if (status != napi_ok) {        OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create media typed array");        return nullptr;    }    data.release();    return result;}static napi_value GetRawFileContent(napi_env env, napi_callback_info info){    OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "GetFileContent Begin");    size_t requireArgc = 3;    size_t argc = 2;    napi_value argv[2] = { nullptr };    // 获取参数信息    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);    // argv[0]即为函数第一个参数Js资源对象,OH_ResourceManager_InitNativeResourceManager转为Native对象。    NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);    size_t strSize;    char strBuf[256];    napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);    std::string filename(strBuf, strSize);    // 获取rawfile指针对象    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");    }    // 获取rawfile大小并申请内存    long len = OH_ResourceManager_GetRawFileSize(rawFile);    std::unique_ptr<uint8_t[]> data= std::make_unique<uint8_t[]>(len);    // 一次性读取rawfile全部内容    int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len);    // 多次部门读取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(rawFile);
  4.     OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);    // 转为js对象    return CreateJsArrayValue(env, data, len);}// 示例三:获取rawfile文件描述符 GetRawFileDescriptornapi_value createJsFileDescriptor(napi_env env, RawFileDescriptor &descriptor){    napi_value result;    napi_status status = napi_create_object(env, &result);    if (status != napi_ok) {        return result;    }    napi_value fd;    status = napi_create_int32(env, descriptor.fd, &fd);    if (status != napi_ok) {        return result;    }    status = napi_set_named_property(env, result, "fd", fd);    if (status != napi_ok) {        return result;    }    napi_value offset;    status = napi_create_int64(env, descriptor.start, &offset);    if (status != napi_ok) {        return result;    }    status = napi_set_named_property(env, result, "offset", offset);    if (status != napi_ok) {        return result;    }    napi_value length;    status = napi_create_int64(env, descriptor.length, &length);    if (status != napi_ok) {        return result;    }    status = napi_set_named_property(env, result, "length", length);    if (status != napi_ok) {        return result;    }    return result;}static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info){    OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest GetRawFileDescriptor Begin");    size_t requireArgc = 3;    size_t argc = 2;    napi_value argv[2] = { nullptr };    // 获取参数信息    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);        napi_valuetype valueType;    napi_typeof(env, argv[0], &valueType);    // 获取native的resourceManager对象    NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);    size_t strSize;    char strBuf[256];    napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);    std::string filename(strBuf, strSize);    // 获取rawfile指针对象    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");    }    // 获取rawfile的描述符RawFileDescriptor {fd, offset, length}    RawFileDescriptor descriptor;    OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor);    // 关闭打开的指针对象    OH_ResourceManager_CloseRawFile(rawFile);
  5.     OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);    // 转为js对象    return createJsFileDescriptor(env,descriptor);}
复制代码
4. Js侧调用

  • 打开src\main\ets\pages\index.ets, 导入"libentry.so";
  • 资源获取包括获取本应用包资源、应用内跨包资源、跨应用包资源。
    获取本应用包resourceManager对象,通过.context().resourceManager方法。
    获取应用内跨包resourceManager对象,通过.context().createModuleContext().resourceManager 方法。
    获取跨应用包resourceManager对象,通过.context.createModuleContext(bundleName:‘bundleName name’,moduleName:‘module name’).resourceManager方法,该方法仅支持体系应用利用。
    Context的更多利用信息请参考应用上下文Context。
  • 调用Native接口getFileList即为src/main/cpp/types/libentry/index.d.ts中声明的接口,传入js的资源对象,以及rawfile文件夹的相对路径。
获取本应用包资源resourceManager对象的示例如下:
  1. import hilog from '@ohos.hilog';
  2. import testNapi from 'libentry.so'  // 导入so
  3. @Entry
  4. @Component
  5. struct Index {
  6.     @State message: string = 'Hello World'
  7.     private resmgr = getContext().resourceManager;  // 获取本应用包的资源对象
  8.     build() {
  9.         Row() {
  10.         Column() {
  11.             Text(this.message)
  12.             .fontSize(50)
  13.             .fontWeight(FontWeight.Bold)
  14.             .onClick(() => {
  15.                 hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO);
  16.                 let rawfilelist = testNapi.getFileList(this.resmgr, ""); //传入资源对象,以及访问的rawfile文件夹名称
  17.                 console.log("rawfilelist" + rawfilelist);
  18.                 let rawfileContet = testNapi.getRawFileContent(this.resmgr, "rawfile1.txt");
  19.                 console.log("rawfileContet" + rawfileContet);
  20.                 let rawfileDescriptor = testNapi.getRawFileDescriptor(this.resmgr, "rawfile1.txt");
  21.                 console.log("getRawFileDescriptor" + rawfileDescriptor.fd, rawfileDescriptor.offset, rawfileDescriptor.length);
  22.             })
  23.         }
  24.         .width('100%')
  25.         }
  26.         .height('100%')
  27.     }
  28. }
复制代码
相干实例

针对资源管理Rawfile开辟,有以下相干实例可供参考:


  • 获取Rawfile资源(API9)
为了能让大家更好的学习鸿蒙(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 立即注册

本版积分规则

傲渊山岳

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

标签云

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