首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >N-API包装不查找函数

N-API包装不查找函数
EN

Stack Overflow用户
提问于 2020-11-18 15:34:38
回答 1查看 179关注 0票数 0

对于C++类,我有一个简单的class包装器。类正在被实例化和解构,但是类中的实例变量没有被声明,即stdout显示导出不包含"App.m_variable“。

我已经阅读了所有的班级文档,我已经下载了所有提到"napi_define_class“的谷歌站点。

不是joy。

任何帮助都将不胜感激!

代码语言:javascript
复制
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()工作正常:

  • 正在调用并创建App()实例
  • 正在调用析构函数并工作。
  • 类将被导出。

但是这些属性,特别是m_variable,应该在出口中显示出来。那么,napi_property_descriptor定义可能有什么问题吗?

还请注意,对n_app_get_m_variable和stdout的调用应该有一个显示它被调用的日志行。但这是不可能的。

注意,对于attributes参数,我尝试了一组不同的值:

  • napi_default
  • napi_configurable
  • napi_static
  • napi_enumerable
EN

回答 1

Stack Overflow用户

发布于 2020-11-19 01:30:27

是我的错。

我假设(出于某种原因)当调用对象的成员函数(如python)时,"this“指针是参数零。当一个静态或非成员函数被调用时,它就不会被传入。

这种假设是错误的。

实际上,在对napi_get_cb_info()的调用中," this“指针是独立于argc/argv检索的,也就是说,在这个调用中它是"jsthis”:

代码语言:javascript
复制
napi_status status = napi_get_cb_info(env, info, &argc, argv, jsthis, nullptr);

我在这里发布了示例代码:cpp。这个回购更进一步,展示了如何在Python和ruby中使用SWIG,对于javascript使用CMake,在CLion中使用CLion。无论如何,nwrap.h代码位于javascript目录中,请参见nWrap.h和index.cpp。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64896241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档