Native Rawfile-Entwicklungshandbuch

Szeneneinführung

Entwickler können dieses Handbuch verwenden, um zu erfahren, wie sie die native Rawfile-Schnittstelle verwenden, um Rawfile-Verzeichnisse und -Dateien in HarmonyOS-Anwendungen zu bedienen. Zu den Funktionen gehören das Durchlaufen, Öffnen, Suchen, Lesen und Schließen von Rawfiles.

Schnittstellenbeschreibung

Entwicklungsschritte

Nehmen Sie als Beispiel die drei Aufrufmethoden zum Abrufen der Rohdatei-Dateiliste, des Rohdatei-Dateiinhalts und des Rohdatei-Deskriptors {fd, offset, length} auf der JS-Seite.

1. Projekt erstellen

2. Abhängigkeiten hinzufügen

Nach Abschluss der Erstellung generiert die IDE ein CPP-Verzeichnis im Projekt, das Dateien wie libentry/index.d.ts, hello.cpp, CMakeLists.txt usw. enthält.

1. Öffnen Sie src/main/cpp/CMakeLists.txt und fügen Sie die Ressource librawfile.z.so und die Protokollabhängigkeit libhilog_ndk.z.so in der Abhängigkeit target_link_libraries hinzu.

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

2. Öffnen Sie die Datei src/main/cpp/types/libentry/index.d.ts. Diese Datei deklariert die anwendungsseitigen Funktionen getFileList, getRawFileContent und getRawFileDescriptor.

import resourceManager from '@ohos.resourceManager';
export const getFileList: (resmgr: resourceManager.ResourceManager, path: string) => Array<String>;
export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array;
export const getRawFileDescriptor: (resmgr: resourceManager.ResourceManager, path: string) => resourceManager.RawFileDescriptor; 

3. Quelldateien ändern

1. Öffnen Sie die Datei src/main/cpp/hello.cpp. Die Datei Init initialisiert die Zuordnung der aktuellen Methode. Die hier definierten externen Schnittstellen sind getFileList, getRawFileContent und getRawFileDescriptor, und die zugeordneten C++-Schnittstellen sind GetFileList, GetRawFileContent, bzw. GetRawFileDescriptor.

EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{    
    napi_property_descriptor desc[] = {        
        { "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);
    return exports;
}
EXTERN_C_END

2. Fügen Sie die entsprechenden drei Methoden zur Datei src/main/cpp/hello.cpp hinzu, wie unten gezeigt

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. Rufen Sie das Js-Ressourcenobjekt aus der Datei hello.cpp ab und konvertieren Sie es in das native Ressourcenobjekt. Sie können die native Schnittstelle der Ressource aufrufen, um die Rohdateiliste, den Rohdateiinhalt und den Rohdateideskriptor {fd, offset, length} abzurufen. . Der Beispielcode lautet wie folgt:

#include <rawfile/raw_file.h>
#include <rawfile/raw_dir.h>
#include <rawfile/raw_file_manager.h>

// 示例一:获取rawfile文件列表 GetFileList
static napi_value GetFileList(napi_env env, napi_callback_info info)
{
    OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest Begin");
    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]);

    // 获取函数argv[1],此为为rawfile相对路径
    size_t strSize;
    char strBuf[256];
    napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
    std::string dirName(strBuf, strSize);

    // 获取对应的rawDir指针对象
    RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str());

    // 获取rawDir下文件及文件夹数量
    int count = OH_ResourceManager_GetRawFileCount(rawDir);

    // 遍历获取文件名称,并保存
    std::vector<std::string> tempArray;
    for(int i = 0; i < count; i++) {
        std::string filename = OH_ResourceManager_GetRawFileName(rawDir, i);
        tempArray.emplace_back(filename);
    }

    napi_value fileList;
    napi_create_array(env, &fileList);
    for (size_t i = 0; i < tempArray.size(); i++) {
        napi_value jsString;
        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);
    return fileList;
}

// 示例二:获取rawfile文件内容 GetRawFileContent
napi_value CreateJsArrayValue(napi_env env, std::unique_ptr<uint8_t[]> &data, long length)
{
    napi_value buffer;
    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);
    if (status != napi_ok) {
        OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create external array buffer");
        return nullptr;
    }
    napi_value result = 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, "Failed to create media typed array");
        return nullptr;
    }
    data.release();
    return result;
}

static napi_value GetRawFileContent(napi_env env, napi_callback_info info)
{
    OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "GetFileContent Begin");
    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_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
    }
    // 获取rawfile大小并申请内存
    long len = OH_ResourceManager_GetRawFileSize(rawFile);
    std::unique_ptr<uint8_t[]> data= std::make_unique<uint8_t[]>(len);
    // 读取rawfile
    int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len);
    // 关闭打开的指针对象
    OH_ResourceManager_CloseRawFile(rawFile);
    OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
    // 转为js对象
    return CreateJsArrayValue(env, data, len);
}

// 示例三:获取rawfile文件描述符 GetRawFileDescriptor
napi_value createJsFileDescriptor(napi_env env, RawFileDescriptor &descriptor)
{
    napi_value result;
    napi_status status = napi_create_object(env, &result);
    if (status != napi_ok) {
        return result;
    }
     napi_value fd;
    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_value offset;
    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_value length;
    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;
}

static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)
{
    OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest GetRawFileDescriptor Begin");
    size_t requireArgc = 3;
    size_t argc = 2;
    napi_value argv[2] = { nullptr };
    // 获取参数信息
    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);

    napi_valuetype valueType;
    napi_typeof(env, argv[0], &valueType);
    // 获取native的resourceManager对象
    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_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
    }
    // 获取rawfile的描述符RawFileDescriptor {fd, offset, length}
    RawFileDescriptor descriptor;
    OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor); 
   // 关闭打开的指针对象
    OH_ResourceManager_CloseRawFile(rawFile);
    OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
    // 转为js对象
    return createJsFileDescriptor(env,descriptor);
}

4.  Js-Nebenaufruf

a. Öffnen Sie src\main\ets\pages\index.ets und importieren Sie „libentry.so“;

b. Holen Sie sich das ResourceManager-Objekt des aktuellen js;

c. Rufen Sie die native Schnittstelle getFileList auf, die in src/main/cpp/types/libentry/index.d.ts deklarierte Schnittstelle, und übergeben Sie das Ressourcenobjekt von js und den relativen Pfad des Rawfile-Ordners. Beispiele sind wie folgt:

import hilog from '@ohos.hilog';
import testNapi from 'libentry.so'  // 导入so
@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(() => {
                hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO);
                let rawfilelist = testNapi.getFileList(this.resmgr, ""); //传入资源对象,以及访问的rawfile文件夹名称
                console.log("rawfilelist" + rawfilelist);
                let rawfileContet = testNapi.getRawFileContent(this.resmgr, "rawfile1.txt");
                console.log("rawfileContet" + rawfileContet);
                let rawfileDescriptor = testNapi.getRawFileDescriptor(this.resmgr, "rawfile1.txt");
                console.log("getRawFileDescriptor" + rawfileDescriptor.fd, rawfileDescriptor.offset, rawfileDescriptor.length);
            })
        }
        .width('100%')
        }
        .height('100%')
    }
}

Funktionseinführung

1. Verwenden Sie entsprechend der NativeResourceManager-Instanz die Schnittstelle OH_ResourceManager_OpenRawDir, um die RawDir-Instanz abzurufen.

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

2. Verwenden Sie gemäß der RawDir-Instanz die Schnittstelle OH_ResourceManager_GetRawFileCount, um die Gesamtzahl der Rohdateidateien im entsprechenden Verzeichnis abzurufen.

int count = OH_ResourceManager_GetRawFileCount(rawDir);

3. Verwenden Sie gemäß der RawDir-Instanz die Schnittstelle OH_ResourceManager_GetRawFileName, um den Namen der Rohdateidatei abzurufen, die dem Index im Verzeichnis entspricht.

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

4. Verwenden Sie entsprechend der NativeResourceManager-Instanz die Schnittstelle OH_ResourceManager_OpenRawFile, um die RawFile-Instanz mit dem angegebenen Dateinamen abzurufen.

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

5. Verwenden Sie entsprechend der RawFile-Instanz die Schnittstelle OH_ResourceManager_GetRawFileSize, um die entsprechende Dateigröße der Rohdatei zu erhalten.

long rawFileSize = OH_ResourceManager_GetRawFileSize(rawFile);

6. Verwenden Sie die Schnittstelle OH_ResourceManager_SeekRawFile, um den Rawfile-Offset basierend auf der RawFile-Instanz anzugeben.

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. Verwenden Sie entsprechend der RawFile-Instanz die Schnittstelle OH_ResourceManager_GetRawFileOffset, um den Rawfile-Offset zu erhalten.

long rawFileOffset = OH_ResourceManager_GetRawFileOffset(rawFile);

8. Verwenden Sie entsprechend der RawFile-Instanz die Schnittstelle OH_ResourceManager_ReadRawFile, um den Inhalt der Rawfile-Datei zu lesen.

std::unique_ptr<char[]> mediaData = std::make_unique<char[]>(rawFileSize);
long rawFileOffset = OH_ResourceManager_ReadRawFile(rawFile, mediaData.get(), rawFileSize);

9. Verwenden Sie gemäß der RawFile-Instanz die Schnittstelle OH_ResourceManager_CloseRawFile, um Ressourcen freizugeben, die sich auf die Rawfile-Datei beziehen.

OH_ResourceManager_CloseRawFile(rawFile);

10. Verwenden Sie gemäß der RawDir-Instanz die Schnittstelle OH_ResourceManager_CloseRawDir, um Ressourcen freizugeben, die sich auf das Rawfile-Verzeichnis beziehen.

OH_ResourceManager_CloseRawDir(rawDir);

11. Verwenden Sie entsprechend der RawFile-Instanz die Schnittstelle OH_ResourceManager_GetRawFileDescriptor, um den RawFileDescriptor der Rohdatei abzurufen.

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

12. Verwenden Sie gemäß der RawFileDescriptor-Instanz die Schnittstelle OH_ResourceManager_ReleaseRawFileDescriptor, um den FD der Rohdatei zu schließen.

OH_ResourceManager_ReleaseRawFileDescriptor(descriptor);

13. Verwenden Sie gemäß der NativeResourceManager-Instanz die Schnittstelle OH_ResourceManager_ReleaseNativeResourceManager, um den nativen Ressourcenmanager freizugeben.

OH_ResourceManager_ReleaseNativeResourceManager(nativeResourceManager);

Ich denke du magst

Origin blog.csdn.net/HarmonyOSDev/article/details/134932542
Empfohlen
Rangfolge