📜  如何在调用之前告诉 C++ 函数存在 - Javascript (1)

📅  最后修改于: 2023-12-03 15:09:03.899000             🧑  作者: Mango

如何在调用之前告诉 C++ 函数存在 - Javascript

在使用 Javascript 调用 C++ 函数时,有时需要先告诉 C++ 函数存在以便正确调用。下面介绍两种方法。

1. 使用 emscripten 的 EXPOSE_FUNCS 宏

Emscripten 是一个能把 C/C++ 代码编译成 asm.js 或 WebAssembly 的工具,它提供了一个宏 EXPOSE_FUNCS,可以在 C/C++ 代码中声明需要暴露给 JavaScript 的函数。例如:

// 声明需要暴露给 JavaScript 的函数
extern "C" {
  int myFunction(int arg1, float arg2);
}

// 给需要暴露的函数打上标记
EMSCRIPTEN_KEEPALIVE int myFunction(int arg1, float arg2) {
  // 函数实现
  return 0;
}

然后在 JavaScript 中即可调用该函数:

var result = Module.ccall('myFunction', // 函数名
                         'number',     // 返回类型
                         ['number', 'float'],  // 参数类型
                         [1, 2.3]);    // 参数值
2. 使用 N-API 的 napi_create_function

Node.js 8.0 引入了 N-API,允许编写 Node.js 模块时使用跨不同版本的 Node.js 虚拟机的 C/C++ 代码。N-API 提供了 napi_create_function 接口来创建 JavaScript 函数,可以使用 napi_module_register 将其注册到 Node.js 模块中。例如:

// 函数实现
napi_value myFunction(napi_env env, napi_callback_info info) {
  // 参数解析
  size_t argc = 2;
  napi_value argv[2];
  napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  int arg1, err1 = napi_get_value_int32(env, argv[0], &arg1);
  float arg2, err2 = napi_get_value_double(env, argv[1], &arg2);
  if (err1 != napi_ok || err2 != napi_ok) {
    napi_throw_type_error(env, nullptr, "Wrong arguments");
    return nullptr;
  }

  // 函数实现
  napi_value result;
  napi_create_int32(env, 0, &result);
  return result;
}

// 将函数注册到 Node.js 模块中
napi_value init(napi_env env, napi_value exports) {
  napi_value fn;
  napi_create_function(env, nullptr, 0, myFunction, nullptr, &fn);
  napi_set_named_property(env, exports, "myFunction", fn);
  return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, init)

然后在 JavaScript 中即可使用 require 导入模块并调用该函数:

const addon = require('./addon');
const result = addon.myFunction(1, 2.3);

以上是两种常用的方法,实际使用时应根据具体情况选择。