场景介绍
开发者能够通过本辅导了解在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.创建工程
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);