鸿蒙5.0&next开发【Native侧实现文件访问开发】NDK开发

概述

在对文件处理性能要求高的场景中,Native侧访问文件处理数据比在[ArkTS侧操作文件]有更高的效率和更快的响应,例如处理大文件、复杂的文件操作以及实时通信等低时延场景。根据文件位置的不同,应用在Native侧访问文件可以分为以下三种类型:

  • 类型一:访问应用沙箱内的文件进行读写操作,主要是通过沙箱路径进行访问;
  • 类型二:访问应用资源文件进行读操作,可以通过传递资源管理器进行访问;
  • 类型三:访问系统公共目录中的文件进行读写操作,可以使用文件picker来获取文件描述符。

本文将针对这三种场景给出具体的实现方案。

访问应用沙箱文件

[应用沙箱]是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为“应用沙箱目录”,沙箱中的文件就需要通过沙箱路径去进行访问。Native侧获取沙箱路径的方案有两种:

  • 方案一:ArkTS侧[获取沙箱路径]传递给Native侧访问文件。
  • 方案二:Native侧直接[拼接沙箱路径]访问文件。

方案一:ArkTS侧获取沙箱路径传递给Native侧访问文件

图1 ArkTS侧获取沙箱路径传递给Native侧访问文件示意图
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现方案

这里以访问沙箱文件并写入文本的场景为例,实现方案分为Native侧定义操作文件的方法和ArkTS侧调用该方法两部分。

第一部分:在Native侧定义一个方法,用于接收沙箱路径并将文本写入到文件中。

  1. 将沙箱路径和要写入文本的内容通过Node-API接口传递到Native侧。
napi_get_value_string_utf8(env, argv[0], pathBuf, sizeof(pathBuf), &pathSize);
napi_get_value_string_utf8(env, argv[1], contentsBuf, sizeof(contentsBuf), &contentsSize);
  1. 通过指定的路径打开文件。
FILE *fp;
fp = fopen(pathBuf, "w");
  1. 使用C标准库的文件操作函数写入文件。

    fprintf(fp, "%s", contentsBuf);
    
  2. 完整代码如下所示:

// entry/src/main/cpp/FileAccessMethods.cpp
static napi_value TransferSandboxPath(napi_env env, napi_callback_info info) {
    size_t argc = 2;
    napi_value argv[2] = {nullptr};
    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);

    //将沙箱路径和要写入文本的内容通过Node-API接口转换成C侧变量
    size_t pathSize, contentsSize;
    char pathBuf[256], contentsBuf[256];
    napi_get_value_string_utf8(env, argv[0], pathBuf, sizeof(pathBuf), &pathSize);
    napi_get_value_string_utf8(env, argv[1], contentsBuf, sizeof(contentsBuf), &contentsSize);

    //通过指定的路径打开文件
    snprintf(pathBuf, sizeof(pathBuf), "%s/TransferSandboxPath.txt", pathBuf);
    FILE *fp;
    fp = fopen(pathBuf, "w");
    if (fp == nullptr) {
        OH_LOG_Print(LOG_APP, LOG_ERROR, DOMAIN, TAG, "open file error!");
        return nullptr;
    }
    //使用C标准库的文件操作函数写入文件
    fprintf(fp, "%s", contentsBuf);
    fclose(fp);
    return nullptr;
}
  1. 将该[C++接口与ArkTS接口进行绑定和映射],同时在index.d.ts文件中,提供该接口方法以便于ArkTS侧调用。

    export const transferSandboxPath: (path: string, contents: string) => void;
    

第二部分:在Native侧访问沙箱文件写数据的功能实现后,在ArkTS侧调用该方法。

  1. 引用Native侧相应的so库。

    import FileAccess from 'libfile_access.so';
    
  2. 在ArkTS侧获取沙箱路径。

    private sandboxFilesDir: string = getContext(this).filesDir;
    
  3. 获取到沙箱路径后,将该路径传递给Native侧,同时传递需要写入的内容。

    FileAccess.transferSandboxPath(this.sandboxFilesDir, content);
    

通过上述步骤,实现了在Native侧通过ArkTS侧传递的沙箱路径访问与操作应用沙箱文件的方案。

效果展示

图2 ArkTS侧传递沙箱路径到Native侧方案效果展示
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方案二:Native侧直接拼接沙箱路径访问文件

图3 Native侧直接拼接沙箱路径访问文件示意图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值