Native获取Rawfile的内容并打印

在ArkTS侧调用Native方法获取Rawfile里的内容

HarmonyOS
2024-05-28 21:36:26
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fujiang1981

使用的 OS 能力相关的核心 API

raw_file_manager.h(提供资源管理rawfile相关功能)

OH_ResourceManager_GetRawFileSize(获取rawfile长度)

OH_ResourceManager_ReadRawFile(读取rawfile内容,从当前位置读取指定长度的数据)

核心代码解释

编写Native方法,创建一个js对象,用于存放Rawfile的内容。

#include "napi/native_api.h" 
#include <bits/alltypes.h> 
#include <node_api.h> 
#include <rawfile/raw_file_manager.h> 
#include <hilog/log.h> 
#include <string> 
​ 
//创建一个js对象,用于存放Rawfile的内容 
napi_value CreateJsArrayValue(napi_env env, std::unique_ptr<uint8_t[]> &data, long length) { 
  napi_value buffer; 
//分配一个附加有外部数据的js ArrayBuffer 
  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); 
   
  napi_value result = nullptr; 
//通过现有的ArrayBuffer创建一个js TypeArray 
  status = napi_create_typedarray(env, napi_uint8_array, length, buffer, 0, &result); 
   
  //data.release(); 
  return result; 
} 
​ 
static napi_value GetRawFileContent(napi_env env, napi_callback_info info) { 
//设置ts侧传过来的参数个数 
  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_INFO(LOG_APP, "OH_ResourceManager_OpenRawFile success"); 
  } 
  // 获取Rawfile大小并申请内存 
  long len = OH_ResourceManager_GetRawFileSize(rawFile); 
  std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(len); 
  // 读取rawfile 
  long res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len); 
  // 关闭打开的指针对象 
  OH_ResourceManager_CloseRawFile(rawFile); 
  OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); 
  // 转为js对象 
  return CreateJsArrayValue(env, data, len); 
} 
​ 
EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
  napi_property_descriptor desc[] = { 
      {"getRawFileContent", nullptr, GetRawFileContent, nullptr, nullptr, nullptr, napi_default, nullptr} 
  }; 
  napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
  return exports; 
} 
EXTERN_C_END 
​ 
static napi_module demoModule = { 
  .nm_version = 1, 
  .nm_flags = 0, 
  .nm_filename = nullptr, 
  .nm_register_func = Init, 
  .nm_modname = "entry", 
  .nm_priv = ((void*)0), 
  .reserved = { 0 }, 
}; 
​ 
extern "C" __attribute__((constructor)) void RegisterEntryModule(void) 
{ 
  napi_module_register(&demoModule); 
}

暴露给ts侧调用的接口

import resourceManager from '@ohos.resourceManager'; 
​ 
export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array;

ets侧调用方法

import testNapi from 'libentry.so' // 导入so 
import util from '@ohos.util'; 
​ 
@Entry 
@Component 
struct Index { 
@State message: string = 'Hello World' 
private resmgr = getContext().resourceManager; // 获取js的资源对象 
build() { 
  Row() { 
    Column() { 
      Text(this.message) 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
        .onClick(() => { 
​ 
          let rawfileContet = testNapi.getRawFileContent(this.resmgr, "testfile.txt");//获取testfiel里的内容 
​ 
          let textDecoder:util.TextDecoder =util.TextDecoder.create(); 
          let retStr = textDecoder.decodeWithStream(rawfileContet);//对内容进行数据解析 
​ 
          console.log("rawfilecontet: " + retStr); 
​ 
        }) 
    } 
    .width('100%') 
  } 
  .height('100%') 
} 
}

实现效果

在Rawfile下创建一个名为testfile.txt的文本文件

在testfile.txt里编写以下字符

运行,成功输出

适配版本信息

  • IDE:DevEco Studio 4.0.1.601
  • SDK:HarmoneyOS 4.0.10.11
分享
微博
QQ
微信
回复
2024-05-29 22:51:03
相关问题
text内容如何实时获取添加修改?
1770浏览 • 1回复 待解决
hilog如何打印{private}隐私标志内容
886浏览 • 1回复 待解决
Native侧如何打印char指针
596浏览 • 1回复 待解决
native层如何访问rawfile二进制文件
702浏览 • 1回复 待解决
Native侧如何使用hilog打印出日志信息
860浏览 • 1回复 待解决
nativelog获取不到
485浏览 • 1回复 待解决
native侧创建file保存进沙箱路径
478浏览 • 1回复 待解决
JS 获取控件位置动态赋值问题
2443浏览 • 1回复 待解决
如何调用系统拍照获取图片
175浏览 • 1回复 待解决
Native侧如何获取可操作文件目录
648浏览 • 1回复 待解决
Native如何通过napi获取ArrayBuffer?
1811浏览 • 1回复 待解决
获取网络图片保存到相册
360浏览 • 1回复 待解决