2017-06-13 62 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;