我正在尝试使用JS回调进行日志记录来初始化节点插件模块。 Initialize方法旨在存储用于从其他方法调用的回调值。因此,我使用napi_create_reference
添加了对回调的引用。
但是当我尝试从第二个插件方法MyAddonMethod
调用回调时,会收到napi_invalid_arg
错误。
我已尝试调查此问题。对于napi_typeof
中的回调值,对MyAddonMethod
的调用也返回napi_invalid_arg
。尽管有很强的参考力,但该回调值看起来还是被垃圾回收了。
我在做什么错? napi_create_reference
是否实际上阻止了在附加调用之间进行垃圾回收?
// JS side:
const addon = require('./addon.node');
function logCallbackFunction(logLine)
{
console.log("Trace: " + logLine);
}
addon.Initialize(logCallbackFunction);
addon.MyAddonMethod();
// C++ side
// Initialize method:
napi_ref ref;
napi_create_reference(env, value, 1, &ref);
g_Value = value; // store the value somewhere between calls
// MyAddonMethod method: // "env" doesn't change from call to call
napi_valuetype type;
napi_status stat = napi_typeof(env, g_Value, &type); // napi_invalid_arg
答案 0 :(得分:0)
我终于发现自己在做什么错。两次通话之间无法存储g_Value
。相反,应该存储napi_ref
并使用napi_get_reference_value
函数来提取对应的值。因此,C ++辅助代码应如下所示:
// Initialize method:
napi_ref ref;
napi_create_reference(env, value, 1, &ref);
g_Ref = ref; // store the reference somewhere between calls
// MyAddonMethod method:
napi_value referenceValue;
napi_get_reference_value(env, g_Ref, &referenceValue);
napi_valuetype type;
napi_status stat = napi_typeof(env, referenceValue, &type); // napi_ok, napi_function
当然,当您不再需要使用napi_delete_reference
释放引用时,您应该不要忘记。