📅  最后修改于: 2023-12-03 15:09:03.899000             🧑  作者: Mango
在使用 Javascript 调用 C++ 函数时,有时需要先告诉 C++ 函数存在以便正确调用。下面介绍两种方法。
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]); // 参数值
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);
以上是两种常用的方法,实际使用时应根据具体情况选择。