2017-06-13 37 views
0

我正在开发一个电子应用程序与本地插件在mac上,和所有组件的工作流程是这样的: js in electron - > call addon.node(C++ native addon) - >使用dlopen和dlsym调用dylib。nodejs v8垃圾回收时调用本地插件

从JS的附加GET字符串通过这种方式:

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 

} 

昨天,我们发现了一个错误,这是非常有趣的。它发生在字符串参数非常长的情况下,对于大小约为400字节或甚至更长的funcParam字符串,dylib中的日志显示funcParam的长度到达为0,而以相同方式发送的funcName具有正确的长度并且内容。经过一些调试后,我猜想这个字符串可能是垃圾收集的,所以我创建了一个字符串对象来保存funcParam,然后再次将新指针发送到dylib,它工作正常!

我的问题是:如何做JS引擎工作,使字符串资源的指针是在的Visitable JS原生的插件,而在dylib本地插件调用不可用?

回答

0

我认为实际的问题是,你正在创建和销毁Utf8Value在同一行,并试图解引用悬挂指针。它应该是

Utf8String str(info[0]->ToString()); 
const char* funcName = *str;