napi_new_instance函数
时间: 2023-11-22 18:04:17 浏览: 510
napi_new_instance 是 Node.js 的 N-API 中的一个函数,用于创建一个 JavaScript 对象的实例。这个函数的原型如下:
```c++
napi_status napi_new_instance(napi_env env, napi_value constructor, size_t argc, const napi_value* argv, napi_value* result);
```
参数说明:
- env:N-API 的环境对象。
- constructor:JavaScript 类的构造函数。
- argc:构造函数的参数个数。
- argv:构造函数的参数数组。
- result:用于存储创建的 JavaScript 对象的指针。
函数返回值为一个枚举值 napi_status,表示函数执行的状态,如果状态为 napi_ok,则表示函数执行成功。
使用 napi_new_instance 函数时,需要先获取 JavaScript 类的构造函数,并将构造函数和参数传给函数,函数就会创建一个 JavaScript 对象的实例,并将这个实例存储在 result 参数中。这个函数主要用于在 C++ 中创建 JavaScript 对象的实例,以便在 C++ 中访问 JavaScript 对象的属性和方法。
相关问题
讲解 napi_value NapiAsyKeyGenerator::CreateJsAsyKeyGenerator(napi_env env, napi_callback_info info) { LOGI("enter ..."); size_t expectedArgc = PARAMS_NUM_ONE; size_t argc = expectedArgc; napi_value argv[PARAMS_NUM_ONE] = { nullptr }; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc != expectedArgc) { LOGE("The input args num is invalid."); return NapiGetNull(env); } napi_value instance; napi_value constructor = nullptr; napi_get_reference_value(env, classRef_, &constructor); napi_new_instance(env, constructor, argc, argv, &instance); std::string algName; if (!GetStringFromJSParams(env, argv[0], algName)) { LOGE("failed to get algoName."); return NapiGetNull(env); } HcfAsyKeyGenerator *generator = nullptr; int32_t res = HcfAsyKeyGeneratorCreate(algName.c_str(), &generator); if (res != HCF_SUCCESS) { LOGE("create c generator fail."); return NapiGetNull(env); } NapiAsyKeyGenerator *napiAsyKeyGenerator = new NapiAsyKeyGenerator(generator); napi_wrap( env, instance, napiAsyKeyGenerator, [](napi_env env, void *data, void *hint) { NapiAsyKeyGenerator *napiAsyKeyGenerator = static_cast<NapiAsyKeyGenerator *>(data); delete napiAsyKeyGenerator; return; }, nullptr, nullptr); napi_value napiAlgName = nullptr; napi_create_string_utf8(env, algName.c_str(), NAPI_AUTO_LENGTH, &napiAlgName); napi_set_named_property(env, instance, CRYPTO_TAG_ALG_NAME.c_str(), napiAlgName); LOGI("out ..."); return instance; }
这段代码是一个 N-API 模块中的函数,用于创建一个 JavaScript 对象,该对象包含一个 C++ 对象的实例。函数名为 `CreateJsAsyKeyGenerator`,它接受两个参数:`napi_env` 类型的 `env` 和 `napi_callback_info` 类型的 `info`。
在函数体内,首先获取函数调用时传入的参数数量和参数值。如果参数数量不符合预期,则返回 null。
接下来,使用 `napi_new_instance` 函数创建一个 JavaScript 对象,并将其赋值给变量 `instance`。这个 JavaScript 对象是通过调用一个 C++ 类的构造函数创建的。具体来说,先使用 `napi_get_reference_value` 函数获取一个类的引用值,然后再将这个引用值传递给 `napi_new_instance` 函数,由它来创建 JavaScript 对象。
然后,从 JavaScript 参数中获取一个算法名称,这个名称是一个字符串。如果获取失败,则返回 null。
接下来,调用 C++ 函数 `HcfAsyKeyGeneratorCreate` 来创建一个 C++ 对象的实例。如果创建失败,则返回 null。
接着,将这个 C++ 对象的实例和 JavaScript 对象进行绑定,使得它们可以相互访问。具体来说,使用 `napi_wrap` 函数将它们绑定在一起。在这个过程中,还传递了一个析构函数,以确保 C++ 对象的实例在 JavaScript 对象被垃圾回收时也能被正确地释放掉。
最后,将算法名称作为一个属性设置在 JavaScript 对象中,并返回这个 JavaScript 对象。
代码讲解 napi_value NapiMd::CreateMd(napi_env env, napi_callback_info info) { size_t expectedArgc = ARGS_SIZE_ONE; size_t argc = expectedArgc; napi_value argv[ARGS_SIZE_ONE] = { nullptr }; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc != expectedArgc) { LOGE("The input args num is invalid."); return nullptr; } std::string algoName; if (!GetStringFromJSParams(env, argv[PARAM0], algoName)) { LOGE("Failed to get algorithm."); return nullptr; } HcfMd *mdObj = nullptr; HcfResult res = HcfMdCreate(algoName.c_str(), &mdObj); if (res != HCF_SUCCESS) { napi_throw(env, GenerateBusinessError(env, res, "create C obj failed.")); LOGE("create c mdObj failed."); return nullptr; } napi_value napiAlgName = nullptr; napi_create_string_utf8(env, algoName.c_str(), NAPI_AUTO_LENGTH, &napiAlgName); napi_value instance = nullptr; napi_value constructor = nullptr; napi_get_reference_value(env, classRef_, &constructor); napi_new_instance(env, constructor, argc, argv, &instance); napi_set_named_property(env, instance, CRYPTO_TAG_ALG_NAME.c_str(), napiAlgName); NapiMd *mdNapiObj = new (std::nothrow) NapiMd(mdObj); if (mdNapiObj == nullptr) { LOGE("create napi obj failed"); return nullptr; } napi_wrap( env, instance, mdNapiObj, [](napi_env env, void *data, void *hint) { NapiMd *md = static_cast<NapiMd *>(data); delete md; return; }, nullptr, nullptr); return instance; }
这是一个 C++ 的函数,用于创建一个 MD 对象,并返回一个与 JavaScript 对象绑定的 N-API 对象。以下是函数的代码解释:
- 首先声明了变量 expectedArgc 来保存函数期望的参数个数,同时声明了变量 argc 和数组 argv 用于保存实际传入的参数。
- 接着调用 napi_get_cb_info 函数来获取在 JavaScript 中传入的参数个数和值,并检查传入参数的个数是否符合预期。如果不符合,则返回 nullptr。
- 使用 GetStringFromJSParams 函数从参数中获取算法名称的字符串,如果获取失败,则返回 nullptr。
- 调用 HcfMdCreate 函数创建一个 HcfMd 对象,并将其保存在 mdObj 指针中。如果创建失败,则抛出一个异常,并返回 nullptr。
- 使用 napi_create_string_utf8 函数创建一个算法名称的 N-API 字符串。
- 使用 napi_get_reference_value 函数获取类的构造函数,并使用 napi_new_instance 函数创建一个新的 JavaScript 对象实例。
- 使用 napi_set_named_property 函数将算法名称的 N-API 字符串设置为对象的属性。
- 创建一个 NapiMd 对象并将其保存在 mdNapiObj 指针中。
- 使用 napi_wrap 函数将 NapiMd 对象与 JavaScript 对象实例绑定,使得 JavaScript 中的对象可以访问 NapiMd 对象的属性和方法。
- 最后,返回绑定后的 JavaScript 对象实例。
阅读全文