场景介绍

开发者能够通过本辅导了解在HarmonyOS运用中,如何运用NativeRawfile接口操作Rawfile目录和文件。功能包含遍历、翻开、搜索、读取和封闭Rawfile。

接口阐明

接口名 描述
NativeResourceManager*OH_ResourceManager_InitNativeResourceManager(napi_envenv,napi_valuejsResMgr) 初始化nativeresourcemanager。
RawDir*OH_ResourceManager_OpenRawDir(constNativeResourceManager*mgr,constchar*dirName) 翻开指定rawfile目录。
intOH_ResourceManager_GetRawFileCount(RawDir*rawDir) 获取指定rawfile目录下的rawfile文件数量。
constchar*OH_ResourceManager_GetRawFileName(RawDir*rawDir,intindex) 获取rawfile名字。
RawFile*OH_ResourceManager_OpenRawFile(constNativeResourceManager*mgr,constchar*fileName) 翻开指定rawfile文件。
longOH_ResourceManager_GetRawFileSize(RawFile*rawFile) 获取rawfile文件巨细。
intOH_ResourceManager_SeekRawFile(constRawFile*rawFile,longoffset,intwhence) 指定rawfile内偏移量
longOH_ResourceManager_GetRawFileOffset(constRawFile*rawFile) 获取rawfile偏移量。
intOH_ResourceManager_ReadRawFile(constRawFile*rawFile,void*buf,size_tlength) 读取rawfile文件内容。
voidOH_ResourceManager_CloseRawFile(RawFile*rawFile) 开释rawfile文件相关资源。
voidOH_ResourceManager_CloseRawDir(RawDir*rawDir) 开释rawfile目录相关资源。
boolOH_ResourceManager_GetRawFileDescriptor(constRawFile*rawFile,RawFileDescriptor&descriptor) 获取rawfile的fd。
boolOH_ResourceManager_ReleaseRawFileDescriptor(constRawFileDescriptor&descriptor) 开释rawfile的fd。
voidOH_ResourceManager_ReleaseNativeResourceManager(NativeResourceManager*resMgr) 开释nativeresourcemanager相关资源。

开发步骤

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

1.创建工程

NativeRawfile开发辅导

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 PUBLIClibace_napi.z.solibhilog_ndk.z.solibrawfile.z.so)

2. 翻开src/main/cpp/types/libentry/index.d.ts文件,此文件声明了运用侧函数getFileList、getRawFileContent、getRawFileDescriptor。

importresourceManagerfrom'@ohos.resourceManager';
exportconstgetFileList: (resmgr:resourceManager.ResourceManager,path:string) =>Array<String>;
exportconstgetRawFileContent: (resmgr:resourceManager.ResourceManager,path:string) =>Uint8Array;
exportconstgetRawFileDescriptor: (resmgr:resourceManager.ResourceManager,path:string) =>resourceManager.RawFileDescriptor; 

3.修改源文件

1. 翻开src/main/cpp/hello.cpp文件,文件Init会对当时方法进行初始化映射,这里界说对外接口为getFileList、getRawFileContent、getRawFileDescriptor,映射C 接口分别为GetFileList、GetRawFileContent、GetRawFileDescriptor。

EXTERN_C_START
staticnapi_valueInit(napi_envenv,napi_valueexports)
{
napi_property_descriptordesc[]={
{"getFileList",nullptr,GetFileList,nullptr,nullptr,nullptr,napi_default,nullptr},
{"getRawFileContent",nullptr,GetRawFileContent,nullptr,nullptr,nullptr,napi_default,nullptr},
{"getRawFileDescriptor",nullptr,GetRawFileDescriptor,nullptr,nullptr,nullptr,napi_default,nullptr}
};
napi_define_properties(env,exports,sizeof(desc)/sizeof(desc[0]),desc);
returnexports;
}
EXTERN_C_END

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

staticnapi_valueGetFileList(napi_envenv,napi_callback_infoinfo)
staticnapi_valueGetRawFileContent(napi_envenv,napi_callback_infoinfo)
staticnapi_valueGetRawFileDescriptor(napi_envenv,napi_callback_infoinfo)

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

#include <rawfile/raw_file.h>
#include <rawfile/raw_dir.h>
#include <rawfile/raw_file_manager.h>
//示例一:获取rawfile文件列表GetFileList
staticnapi_valueGetFileList(napi_envenv,napi_callback_infoinfo)
{
OH_LOG_Print(LOG_APP,LOG_ERROR,GLOBAL_RESMGR,tag, "NDKTestBegin");
size_trequireArgc= 3;
size_targc= 2;
napi_valueargv[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_tstrSize;
charstrBuf[256];
napi_get_value_string_utf8(env,argv[1],strBuf,sizeof(strBuf), &strSize);
std::stringdirName(strBuf,strSize);
    //获取对应的rawDir指针目标
RawDir*rawDir=OH_ResourceManager_OpenRawDir(mNativeResMgr,dirName.c_str());
    //获取rawDir下文件及文件夹数量
intcount=OH_ResourceManager_GetRawFileCount(rawDir);
    //遍历获取文件称号,并保存
std::vector<std::string>tempArray;
for(inti= 0;i<count;i  ){
std::stringfilename=OH_ResourceManager_GetRawFileName(rawDir,i);
tempArray.emplace_back(filename);
}
napi_valuefileList;
napi_create_array(env, &fileList);
for(size_ti= 0;i<tempArray.size();i  ){
napi_valuejsString;
napi_create_string_utf8(env,tempArray[i].c_str(),NAPI_AUTO_LENGTH, &jsString);
napi_set_element(env,fileList,i,jsString);
}
    //封闭翻开的指针目标
OH_ResourceManager_CloseRawDir(rawDir);
OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
    returnfileList;
}
//示例二:获取rawfile文件内容GetRawFileContent
napi_valueCreateJsArrayValue(napi_envenv,std::unique_ptr<uint8_t[]> &data,longlength)
{
napi_valuebuffer;
napi_statusstatus=napi_create_external_arraybuffer(env, data.get(),length,
[](napi_envenv,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, "Failedtocreateexternalarraybuffer");
        returnnullptr;
}
napi_valueresult =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, "Failedtocreatemediatypedarray");
        returnnullptr;
}
    data.release();
    return result;
}
staticnapi_valueGetRawFileContent(napi_envenv,napi_callback_infoinfo)
{
OH_LOG_Print(LOG_APP,LOG_ERROR,GLOBAL_RESMGR,tag, "GetFileContentBegin");
size_trequireArgc= 3;
size_targc= 2;
napi_valueargv[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_tstrSize;
charstrBuf[256];
napi_get_value_string_utf8(env,argv[1],strBuf,sizeof(strBuf), &strSize);
std::stringfilename(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_OpenRawFilesuccess");
}
    //获取rawfile巨细并请求内存
longlen=OH_ResourceManager_GetRawFileSize(rawFile);
std::unique_ptr<uint8_t[]> data=std::make_unique<uint8_t[]>(len);
    //读取rawfile
intres=OH_ResourceManager_ReadRawFile(rawFile, data.get(),len);
    //封闭翻开的指针目标
OH_ResourceManager_CloseRawFile(rawFile);
OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
    //转为js目标
    returnCreateJsArrayValue(env, data,len);
}
//示例三:获取rawfile文件描述符GetRawFileDescriptor
napi_valuecreateJsFileDescriptor(napi_envenv,RawFileDescriptor&descriptor)
{
napi_valueresult;
napi_statusstatus=napi_create_object(env, &result);
    if (status!=napi_ok){
        return result;
}
napi_valuefd;
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_valueoffset;
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_valuelength;
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;
}
staticnapi_valueGetRawFileDescriptor(napi_envenv,napi_callback_infoinfo)
{
OH_LOG_Print(LOG_APP,LOG_ERROR,GLOBAL_RESMGR,tag, "NDKTestGetRawFileDescriptorBegin");
size_trequireArgc= 3;
size_targc= 2;
napi_valueargv[2]={nullptr};
    //获取参数信息
napi_get_cb_info(env,info, &argc,argv,nullptr,nullptr);
napi_valuetypevalueType;
napi_typeof(env,argv[0], &valueType);
    //获取native的resourceManager目标
NativeResourceManager*mNativeResMgr=OH_ResourceManager_InitNativeResourceManager(env,argv[0]);
size_tstrSize;
charstrBuf[256];
napi_get_value_string_utf8(env,argv[1],strBuf,sizeof(strBuf), &strSize);
std::stringfilename(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_OpenRawFilesuccess");
}
    //获取rawfile的描述符RawFileDescriptor{fd,offset,length}
RawFileDescriptordescriptor;
OH_ResourceManager_GetRawFileDescriptor(rawFile,descriptor); 
   //封闭翻开的指针目标
OH_ResourceManager_CloseRawFile(rawFile);
OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
    //转为js目标
    returncreateJsFileDescriptor(env,descriptor);
}

4. Js侧调用

a. 翻开srcmainetspagesindex.ets,导入”libentry.so”;

b. 获取当时js的resourceManager目标;

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

importhilogfrom'@ohos.hilog';
importtestNapifrom'libentry.so'//导入so
@Entry
@Component
structIndex{
@Statemessage:string='HelloWorld'
privateresmgr=getContext().resourceManager;//获取js的资源目标
build(){
Row(){
Column(){
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(()=>{
hilog.isLoggable(0x0000,'testTag',hilog.LogLevel.INFO);
letrawfilelist=testNapi.getFileList(this.resmgr,"");//传入资源目标,以及访问的rawfile文件夹称号
console.log("rawfilelist" rawfilelist);
letrawfileContet=testNapi.getRawFileContent(this.resmgr,"rawfile1.txt");
console.log("rawfileContet" rawfileContet);
letrawfileDescriptor=testNapi.getRawFileDescriptor(this.resmgr,"rawfile1.txt");
console.log("getRawFileDescriptor" rawfileDescriptor.fd,rawfileDescriptor.offset,rawfileDescriptor.length);
})
}
.width('100%')
}
.height('100%')
}
}

函数介绍

1. 依据NativeResourceManager实例,运用OH_ResourceManager_OpenRawDir接口获取RawDir实例。

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

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

intcount=OH_ResourceManager_GetRawFileCount(rawDir);

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

for(intindex=0;index<count;index  ){
std::stringfileName=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文件巨细。

longrawFileSize=OH_ResourceManager_GetRawFileSize(rawFile);

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

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

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

longrawFileOffset=OH_ResourceManager_GetRawFileOffset(rawFile);

8. 依据RawFile实例,运用OH_ResourceManager_ReadRawFile接口读取rawfile文件内容。

std::unique_ptr<char[]>mediaData=std::make_unique<char[]>(rawFileSize);
longrawFileOffset=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。

RawFileDescriptordescriptor;
boolresult=OH_ResourceManager_GetRawFileDescriptor(rawFile,descriptor);

12. 依据RawFileDescriptor实例,运用OH_ResourceManager_ReleaseRawFileDescriptor接口封闭rawfile的fd。

OH_ResourceManager_ReleaseRawFileDescriptor(descriptor);

13. 依据NativeResourceManager实例,运用OH_ResourceManager_ReleaseNativeResourceManager接口开释nativeresourcemanager。

OH_ResourceManager_ReleaseNativeResourceManager(nativeResourceManager);