napi_create_external和napi_get_value_external接口在处理外部对象时有何作用?

阅读 596
avatarAI BotBETA
`napi_create_external` 和 `napi_get_value_external` 接口在处理外部对象时的作用如下:

- `napi_create_external`:此接口用于创建一个 JavaScript 值,该值表示一个外部对象。这个外部对象可以是任何 C/C++ 端的原生对象或数据结构。通过此接口,你可以将这个原生对象与 JavaScript 环境中的某个值关联起来,使得 JavaScript 代码可以访问和操作这个原生对象。创建时,你需要提供一个指向原生对象的指针和一个用于管理该对象生命周期的清理函数(当 JavaScript 值被垃圾回收时,这个清理函数会被调用)。

- `napi_get_value_external`:此接口用于从 JavaScript 值中提取之前通过 `napi_create_external` 创建的外部对象。它允许你在原生代码中获取与该 JavaScript 值关联的原生对象指针,从而进行进一步的操作或处理。

这两个接口共同提供了一种机制,使得原生代码和 JavaScript 代码可以安全、有效地共享和交换数据。
1 个回答

napi_create_external用于创建包装自定义的C/C++对象并将其公开给ArkTS代码,创建时可以指定释放外部数据的回调函数,以便在合适的时候释放资源。napi_get_value_external用于获得napi_create_external所创建的外部对象的值,在C++代码中,先创建外部数据(如分配内存并初始化),然后调用napi_create_external创建带有外部数据的对象,再调用napi_get_value_external获取外部数据的值,最后将获取到的值转换为napi_value类型返回。示例代码如下:

#include <cstdlib>
#include <string>
#include "napi/native_api.h"

void finalizeCallback(napi_env env, void *data, void *hint) {
    free(data);
}

static napi_value GetExternalType(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    napi_valuetype valueType;
    napi_typeof(env, args[0], &valueType);
    napi_value returnValue = nullptr;
    if (valueType == napi_external) {
        napi_get_boolean(env, true, &returnValue);
    } else {
        napi_get_boolean(env, false, &returnValue);
    }
    return returnValue;
}

static napi_value CreateExternal(napi_env env, napi_callback_info info) {
    const size_t dataSize = 10;
    void *data = malloc(dataSize);
    memset(data, 0, dataSize);
    napi_value result = nullptr;
    napi_status status = napi_create_external(env, data, finalizeCallback, nullptr, &result);
    if (status!= napi_ok) {
        napi_throw_error(env, nullptr, " Node-API Failed to create external data");
        return nullptr;
    }
    return result;
}

static napi_value GetValueExternal(napi_env env, napi_callback_info info) {
    int external = 5;
    int* data = &external;
    napi_value setExternal = nullptr;
    napi_create_external(env, data, nullptr, nullptr, &setExternal);
    void *getExternal;
    napi_get_value_external(env, setExternal, &getExternal);
    napi_value result = nullptr;
    napi_create_int32(env, *(int *)getExternal, &result);
    return result;
}

ArkTS侧调用CreateExternal创建外部对象,调用GetExternalType检查对象类型,调用GetValueExternal获取外部对象的值,并通过日志输出相关结果(如hilog.info(0x0000, 'testTag', 'Test Node-API napi_create_external:%{public}s', testNapi.getExternalType(externalData));等)。
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题