【发布时间】:2017-06-13 06:36:23
【问题描述】:
我正在mac上开发一个带有原生插件的电子应用,所有组件的工作流程是这样的: js 中的 electron -> 调用 addon.node(c++ native addon) -> 使用 dlopen 和 dlsym 调用 dylib。
插件通过这种方式从js获取字符串:
NAN_METHOD(CallAsyncFunction) {
// actions guarantee dll is loaded
//....
const char* funcName = *Utf8String(info[0]->ToString());
const char* funcParam = *Utf8String(info[1]->ToString());
//get function pointer by dlsym
//call the function in dylib
}
昨天我们发现了一个非常有趣的错误。字符串param很长的时候会出现这种情况,对于一个大小约400字节甚至更长的funcParam字符串,dylib中的log显示到达的funcParam长度为0,而同样发送的funcName长度正确,内容。经过一些调试后,我猜测该字符串可能已被垃圾收集,所以我创建了一个字符串对象来保存 funcParam,然后再次将新指针发送到 dylib,它起作用了!
我的问题是:js 引擎是如何工作的,以便字符串资源指针在 js 原生插件中可访问,而在原生插件调用的 dylib 中不可用?
【问题讨论】:
标签: node.js garbage-collection electron node.js-addon