我有一個使用N-API的簡單原生 Node.js 插件。
它匯出兩個函式,set_callback
和call_callback
:
set_callback
接受一個函式引數并將其分配給一個全域變數js_callback
call_callback
呼叫js_callback
使用napi_call_function()
我正在使用這樣的插件:
const addon = require("./build/Release/addon.node");
const callback = function() {
console.log("The callback was called!");
};
addon.set_callback(callback);
addon.call_callback();
在set_callback
函式內部,js_callback
實際上指向傳遞的函式并且它是可用的:
set_callback:
js_callback = 00000053268FEE88
typeof(js_callback) = 7 (napi_function)
然而,在call_callback
同一個全域變數中,現在指的是別的東西:它指向同一個值,但現在有不同的型別:
call_callback:
js_callback = 00000053268FEE88
typeof(js_callback) = 6 (napi_object)
導致napi_call_function()
失敗的原因:
addon.call_callback();
^
Error: Invalid argument
at Object.<anonymous>
存盤函式參考以便以后在 N-API 中呼叫它的正確方法是什么?
插件的源代碼:
#include <stdio.h>
#include <node_api.h>
napi_value js_null;
napi_value js_callback;
napi_value addon_set_callback(napi_env env, napi_callback_info info) {
size_t argc = 1;
napi_value argv[1];
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
js_callback = argv[0];
printf("set_callback:\n");
napi_valuetype type;
NAPI_CALL(env, napi_typeof(env, js_callback, &type));
printf(" js_callback = %p\n", js_callback);
printf(" typeof(js_callback) = %d\n\n", type);
return js_null;
}
napi_value addon_call_callback(napi_env env, napi_callback_info info) {
printf("call_callback:\n");
napi_valuetype type;
NAPI_CALL(env, napi_typeof(env, js_callback, &type));
printf(" js_callback = %p\n", js_callback);
printf(" typeof(js_callback) = %d\n\n", type);
napi_value result;
NAPI_CALL(env, napi_call_function(env, js_null, js_callback, 0, NULL, &result));
return js_null;
}
napi_value addon_init(napi_env env, napi_value exports) {
napi_get_null(env, &js_null);
napi_value fn_set_callback;
napi_value fn_call_callback;
NAPI_CALL(env, napi_create_function(env, NULL, 0, addon_set_callback, NULL, &fn_set_callback));
NAPI_CALL(env, napi_create_function(env, NULL, 0, addon_call_callback, NULL, &fn_call_callback));
NAPI_CALL(env, napi_set_named_property(env, exports, "set_callback", fn_set_callback));
NAPI_CALL(env, napi_set_named_property(env, exports, "call_callback", fn_call_callback));
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, addon_init)
uj5u.com熱心網友回復:
我不是 N-API 專家,但在 V8 術語中,您需要的是v8::Persistent
. 快速瀏覽一下 N-API 檔案,那里似乎被稱為“參考”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/530893.html