【问题标题】:node-addon-api how to pass int pointer back and forth between JS and C/C++node-addon-api 如何在 JS 和 C/C++ 之间来回传递 int 指针
【发布时间】:2026-01-15 09:25:02
【问题描述】:

我有以下后端功能:

// foo.c

void cStart(pid_t* pid)
{
  *pid = getpid();

  // event-loop keep running until receive SIGINT signal
}

void cStop(pid_t* pid)
{
  kill(*pid, SIGINT);
}
// addon.cpp

#include "addon.h"
#include "foo.h"

Napi::Number addon::run_pipeline_wrapped(const Napi::CallbackInfo &info)
{
  Napi::Env env = info.Env();

  // get the buffer from JS, pass it to cStart to be modified in-place [?]
  cStart(pid_t* pid);
}

Napi::Number addon::kill_pipeline_wrapped(const Napi::CallbackInfo &info)
{ 
  Napi::Env env = info.Env();

  // get the modified (by cStart) buffer from JS, pass it to cStop [?]
  cStop(pid_t* pid);
}

从前端,当点击开始按钮时,一个C进程将开始运行,直到它收到一个SIGINT信号,当点击停止按钮时,SIGINT信号被发送给正在运行的C进程。 int* 将按如下方式运行:JS(单击开始按钮)-> C/C++(cStart 已修改 int*,因此 int* 不会显式返回给 JS)-> JS(单击停止按钮)-> C/C++)。那么如何在 JS 和 C/C++ 之间来回传递一个 int 指针呢?

【问题讨论】:

    标签: c++ c node-addon-api


    【解决方案1】:

    您不必将指针传递给 JS。

    您可以改用全局状态:

    // foo.c
    
    pid_t* my_pid;
    
    void cStart(void)
    {
      my_pid = getpid(); // save the pid
    
      // event-loop keep running until receive SIGINT signal
    }
    
    void cStop(void)
    {
      // kill the process from earlier
      kill(*my_pid, SIGINT);
    }
    
    

    注意,但是这假设您只有一个在调用cStart 和调用cEnd 之间没有被其他任何东西改变。因此,在cEnd 中,它应该终止单击start 按钮的同一进程。

    您的 C++ 代码将如下所示:

    // addon.cpp
    
    #include "addon.h"
    #include "foo.h"
    
    Napi::Number addon::run_pipeline_wrapped(const Napi::CallbackInfo &info)
    {
      Napi::Env env = info.Env();
      cStart();
    }
    
    Napi::Number addon::kill_pipeline_wrapped(const Napi::CallbackInfo &info)
    { 
      Napi::Env env = info.Env();
      cStop();
    }
    

    【讨论】: