当前位置:   article > 正文

Native Rawfile 开发指导_getrawfilecontent

getrawfilecontent

场景介绍

开发者可以通过本指导了解在 HarmonyOS 应用中,如何使用 Native Rawfile 接口操作 Rawfile 目录和文件。功能包括遍历、打开、搜索、读取和关闭 Rawfile。

接口说明

开发步骤

以 Js 侧获取 rawfile 文件列表、rawfile 文件内容、rawfile 描述符{fd, offset, length}三种调用方式为例。

1. 创建工程

2. 添加依赖

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

1.  打开 src/main/cpp/CMakeLists.txt,在 target_link_libraries 依赖中添加资源的 librawfile.z.so 以及日志依赖 libhilog_ndk.z.so。

target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so librawfile.z.so)

2.  打开 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. 修改源文件

1.  打开 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, nullptrnullptrnullptr, napi_default, nullptr },
  6.         { "getRawFileContent"nullptr, GetRawFileContent, nullptrnullptrnullptr, napi_default, nullptr },
  7.         { "getRawFileDescriptor"nullptr, GetRawFileDescriptor, nullptrnullptrnullptr, napi_default, nullptr }
  8.     };
  9.      napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
  10. return exports;
  11. }
  12. EXTERN_C_END

2.  把 src/main/cpp/hello.cpp 文件中,增加对应的三个方法,如下所示

static napi_value GetFileList(napi_env env, napi_callback_info info)static napi_value GetRawFileContent(napi_env env, napi_callback_info info)static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)

3.  hello.cpp 文件中获取 Js 的资源对象,并转为 Native 的资源对象,即可调用资源的 Native 接口,获取 rawfile 列表、rawfile 文件内容以及 rawfile 描述符{fd, offset, length}三种调用方式示例代码如下:

  1. #include <rawfile/raw_file.h>
  2. #include <rawfile/raw_dir.h>
  3. #include <rawfile/raw_file_manager.h>
  4. // 示例一:获取rawfile文件列表 GetFileList
  5. static napi_value GetFileList(napi_env env, napi_callback_info info)
  6. {
  7. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest Begin");
  8. size_t requireArgc = 3;
  9. size_t argc = 2;
  10. napi_value argv[2] = { nullptr };
  11. // 获取参数信息
  12. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  13. // argv[0]即为函数第一个参数Js资源对象,OH_ResourceManager_InitNativeResourceManager转为Native对象。
  14. NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
  15. // 获取函数argv[1],此为为rawfile相对路径
  16. size_t strSize;
  17. char strBuf[256];
  18. napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
  19. std::string dirName(strBuf, strSize);
  20. // 获取对应的rawDir指针对象
  21. RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str());
  22. // 获取rawDir下文件及文件夹数量
  23. int count = OH_ResourceManager_GetRawFileCount(rawDir);
  24. // 遍历获取文件名称,并保存
  25. std::vector<std::string> tempArray;
  26. for(int i = 0; i < count; i++) {
  27. std::string filename = OH_ResourceManager_GetRawFileName(rawDir, i);
  28. tempArray.emplace_back(filename);
  29. }
  30. napi_value fileList;
  31. napi_create_array(env, &fileList);
  32. for (size_t i = 0; i < tempArray.size(); i++) {
  33. napi_value jsString;
  34. napi_create_string_utf8(env, tempArray[i].c_str(), NAPI_AUTO_LENGTH, &jsString);
  35. napi_set_element(env, fileList, i, jsString);
  36. }
  37. // 关闭打开的指针对象
  38. OH_ResourceManager_CloseRawDir(rawDir);
  39. OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
  40. return fileList;
  41. }
  42. // 示例二:获取rawfile文件内容 GetRawFileContent
  43. napi_value CreateJsArrayValue(napi_env env, std::unique_ptr<uint8_t[]> &data, long length)
  44. {
  45. napi_value buffer;
  46. napi_status status = napi_create_external_arraybuffer(env, data.get(), length,
  47. [](napi_env env, void *data, void *hint) {
  48. delete[] static_cast<char*>(data);
  49. }, nullptr, &buffer);
  50. if (status != napi_ok) {
  51. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create external array buffer");
  52. return nullptr;
  53. }
  54. napi_value result = nullptr;
  55. status = napi_create_typedarray(env, napi_uint8_array, length, buffer, 0, &result);
  56. if (status != napi_ok) {
  57. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create media typed array");
  58. return nullptr;
  59. }
  60. data.release();
  61. return result;
  62. }
  63. static napi_value GetRawFileContent(napi_env env, napi_callback_info info)
  64. {
  65. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "GetFileContent Begin");
  66. size_t requireArgc = 3;
  67. size_t argc = 2;
  68. napi_value argv[2] = { nullptr };
  69. // 获取参数信息
  70. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  71. // argv[0]即为函数第一个参数Js资源对象,OH_ResourceManager_InitNativeResourceManager转为Native对象。
  72. NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
  73. size_t strSize;
  74. char strBuf[256];
  75. napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
  76. std::string filename(strBuf, strSize);
  77. // 获取rawfile指针对象
  78. RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
  79. if (rawFile != nullptr) {
  80. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
  81. }
  82. // 获取rawfile大小并申请内存
  83. long len = OH_ResourceManager_GetRawFileSize(rawFile);
  84. std::unique_ptr<uint8_t[]> data= std::make_unique<uint8_t[]>(len);
  85. // 读取rawfile
  86. int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len);
  87. // 关闭打开的指针对象
  88. OH_ResourceManager_CloseRawFile(rawFile);
  89. OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
  90. // 转为js对象
  91. return CreateJsArrayValue(env, data, len);
  92. }
  93. // 示例三:获取rawfile文件描述符 GetRawFileDescriptor
  94. napi_value createJsFileDescriptor(napi_env env, RawFileDescriptor &descriptor)
  95. {
  96. napi_value result;
  97. napi_status status = napi_create_object(env, &result);
  98. if (status != napi_ok) {
  99. return result;
  100. }
  101. napi_value fd;
  102. status = napi_create_int32(env, descriptor.fd, &fd);
  103. if (status != napi_ok) {
  104. return result;
  105. }
  106. status = napi_set_named_property(env, result, "fd", fd);
  107. if (status != napi_ok) {
  108. return result;
  109. }
  110. napi_value offset;
  111. status = napi_create_int64(env, descriptor.start, &offset);
  112. if (status != napi_ok) {
  113. return result;
  114. }
  115. status = napi_set_named_property(env, result, "offset", offset);
  116. if (status != napi_ok) {
  117. return result;
  118. }
  119. napi_value length;
  120. status = napi_create_int64(env, descriptor.length, &length);
  121. if (status != napi_ok) {
  122. return result;
  123. }
  124. status = napi_set_named_property(env, result, "length", length);
  125. if (status != napi_ok) {
  126. return result;
  127. }
  128. return result;
  129. }
  130. static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)
  131. {
  132. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest GetRawFileDescriptor Begin");
  133. size_t requireArgc = 3;
  134. size_t argc = 2;
  135. napi_value argv[2] = { nullptr };
  136. // 获取参数信息
  137. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  138. napi_valuetype valueType;
  139. napi_typeof(env, argv[0], &valueType);
  140. // 获取native的resourceManager对象
  141. NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
  142. size_t strSize;
  143. char strBuf[256];
  144. napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
  145. std::string filename(strBuf, strSize);
  146. // 获取rawfile指针对象
  147. RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
  148. if (rawFile != nullptr) {
  149. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
  150. }
  151. // 获取rawfile的描述符RawFileDescriptor {fd, offset, length}
  152. RawFileDescriptor descriptor;
  153. OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor);
  154. // 关闭打开的指针对象
  155. OH_ResourceManager_CloseRawFile(rawFile);
  156. OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
  157. // 转为js对象
  158. return createJsFileDescriptor(env,descriptor);
  159. }

4.  Js 侧调用

a.  打开 src\main\ets\pages\index.ets, 导入"libentry.so";

b.  获取当前 js 的 resourceManager 对象;

c.  调用 Native 接口 getFileList 即为 src/main/cpp/types/libentry/index.d.ts 中声明的接口,传入 js 的资源对象,以及 rawfile 文件夹的相对路径。示例如下:

  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; // 获取js的资源对象
  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. }

函数介绍

1.  根据 NativeResourceManager 实例,使用 OH_ResourceManager_OpenRawDir 接口获取 RawDir 实例。

RawDir* rawDir = OH_ResourceManager_OpenRawDir(nativeResourceManager, path.c_str());

2.  根据 RawDir 实例,使用 OH_ResourceManager_GetRawFileCount 接口获取对应目录下的 rawfile 文件总数 。

int count = OH_ResourceManager_GetRawFileCount(rawDir);

3.  根据 RawDir 实例,使用 OH_ResourceManager_GetRawFileName 接口获取目录下对应 index 的 rawfile 文件名

for (int index = 0index < countindex++) {    std::string fileName = OH_ResourceManager_GetRawFileName(rawDir, index);}

4.  根据 NativeResourceManager 实例,使用 OH_ResourceManager_OpenRawFile 接口获取指定文件名的 RawFile 实例。

RawFile* rawFile = OH_ResourceManager_OpenRawFile(nativeResourceManager, fileName.c_str());

5.  根据 RawFile 实例,使用 OH_ResourceManager_GetRawFileSize 接口获取对应 rawfile 文件大小。

long rawFileSize = OH_ResourceManager_GetRawFileSize(rawFile);

6.  根据 RawFile 实例,使用 OH_ResourceManager_SeekRawFile 接口指定 rawfile 偏移量。

int position = OH_ResourceManager_SeekRawFile(rawFile, 10, 0);int position = OH_ResourceManager_SeekRawFile(rawFile, 0 , 1);int position = OH_ResourceManager_SeekRawFile(rawFile, -10, 2);

7.  根据 RawFile 实例,使用 OH_ResourceManager_GetRawFileOffset 接口获取 rawfile 偏移量。

long rawFileOffset = OH_ResourceManager_GetRawFileOffset(rawFile);

8.  根据 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);

9.  根据 RawFile 实例,使用 OH_ResourceManager_CloseRawFile 接口释放 rawfile 文件相关资源。

OH_ResourceManager_CloseRawFile(rawFile);

10.  根据 RawDir 实例,使用 OH_ResourceManager_CloseRawDir 接口释放 rawfile 目录相关资源。

OH_ResourceManager_CloseRawDir(rawDir);

11.  根据 RawFile 实例,使用 OH_ResourceManager_GetRawFileDescriptor 接口获取 rawfile 的 RawFileDescriptor。

RawFileDescriptor descriptor;bool result = OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor);

12.  根据 RawFileDescriptor 实例,使用 OH_ResourceManager_ReleaseRawFileDescriptor 接口关闭 rawfile 的 fd。

OH_ResourceManager_ReleaseRawFileDescriptor(descriptor);

13.  根据 NativeResourceManager 实例,使用 OH_ResourceManager_ReleaseNativeResourceManager 接口释放 native resource manager。

OH_ResourceManager_ReleaseNativeResourceManager(nativeResourceManager);
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/339384
推荐阅读
相关标签
  

闽ICP备14008679号