[英]N-API wrap not finding function
我有一个围绕 C++ 类的简单 N-API 包装器。 类正在被实例化和解构,但类中的实例变量没有被声明,即标准输出显示导出不包含“App.m_variable”。
我已经阅读了所有文档https://nodejs.org/api/n-api.html#n_api_napi_define_class ,我已经浏览了所有提到“napi_define_class”的谷歌网站。
没有快乐。
任何帮助将不胜感激!
node -v
v12.19.0
lsb_release -a
Description: Ubuntu 20.04.1 LTS
// file: app.h
class App
{
public:
double m_variable = 3.0;
void hello();
};
// file: index.cpp
// handle App() destructor
void n_app_dtor(napi_env env, void* instance, void* /* hint */)
{
std::cout << "jax: " << "n_app_dtor instance=" << instance << std::endl;
delete ((App*) instance);
}
// handle new App()
napi_value n_app_new(napi_env env, napi_callback_info info)
{
<snip>
napi_status status;
napi_value n_result;
status = napi_create_object(env, &n_result);
if (status != napi_ok) <snip...>
App* instance = new App();
std::cout << "jax: " << "n_app_new instance=" << instance << std::endl;
status = napi_wrap(env, n_result, (void*) instance, n_app_dtor, nullptr, nullptr);
if (status != napi_ok) <snip...>
return n_result;
}
// handle get of App::m_variable
napi_value n_app_get_m_variable(napi_env env, napi_callback_info info)
{
std::cout << "jax: " << "n_app_get_m_variable " << std::endl;
<snip>
App* instance;
napi_status status;
status = napi_unwrap(env, argv[0], (void**) &instance);
if (status != napi_ok) <snip...>
std::cout << "jax: " << "n_app_get_m_variable instance=" << instance << std::endl;
napi_value n_result;
status = napi_create_double(env, instance->m_variable, &n_result);
if (status != napi_ok) <snip...>
return n_result;
}
napi_value Init(napi_env env, napi_value exports)
{
napi_status status;
napi_property_descriptor properties[] = {
{"m_variable", nullptr, nullptr, n_app_get_m_variable, nullptr, nullptr, napi_default, nullptr},
};
napi_value n_result;
status = napi_define_class(env, "App", NAPI_AUTO_LENGTH, n_app_new, nullptr, 1, properties, &n_result);
if (status != napi_ok) <...>
status = napi_set_named_property(env, exports, "App", n_result);
if (status != napi_ok) <...>
return exports;
}
NAPI_MODULE(example, Init);
# test.js
console.log("jax: js App proto:", example.App.prototype)
app = new example.App();
console.log("jax: js app:", app)
console.log("jax: js app.m_variable :", app.m_variable)
# output
$ node test.js
jax: js App proto: App {}
jax: n_app_new instance=0x4a4caf0
jax: js app: {}
jax: js app.m_variable : undefined
jax: n_app_dtor instance=0x4a4caf0
您可以看到有充分的证据表明 napi_define_class() 工作正常:
但是属性,特别是 m_variable,应该显示在导出中。 那么 napi_property_descriptor 定义可能有问题?
另请注意,对 n_app_get_m_variable 和 stdout 的调用应该有一个日志行显示它被调用了。 但这不会发生。
请注意我尝试了一系列不同值的属性参数:
我的错。
我假设(出于某种原因)当对象的成员函数被调用(即像 python)时,“this”指针是参数零。 当一个静态或非成员函数被调用时,它不会被传入。
这种假设是错误的。
实际上,“this”指针在调用 napi_get_cb_info() 时与 argc/argv 分开检索,即在此调用中它是“jsthis”:
napi_status status = napi_get_cb_info(env, info, &argc, argv, jsthis, nullptr);
我在这里发布了示例代码: swig_example_cpp 。 这个 repo 更进一步,展示了如何将 SWIG 用于 Python 和 ruby,如何将 N-API 用于 javascript 以及如何在 CLion 中使用 CMake。 在任何情况下,N-API 代码都在 javascript 目录中,请参阅 nwrap.h 和 index.cpp。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.