簡體   English   中英

N-API 包裝找不到功能

[英]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() 工作正常:

  • 正在調用和創建 App() 實例
  • 正在調用析構函數並在工作
  • 正在導出類

但是屬性,特別是 m_variable,應該顯示在導出中。 那么 napi_property_descriptor 定義可能有問題?

另請注意,對 n_app_get_m_variable 和 stdout 的調用應該有一個日志行顯示它被調用了。 但這不會發生。

請注意我嘗試了一系列不同值的屬性參數:

  • napi_default
  • napi_configurable
  • napi_static
  • napi_enumerable

我的錯。

我假設(出於某種原因)當對象的成員函數被調用(即像 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM