Ich entwickle eine Elektronen App mit nativem Addon auf Mac, und der Workflow aller Komponenten ist wie folgt: js in electron -> call addon.node (C++ natives Addon) -> Rufen Sie dylib mit dlopen und dlsym auf.nodejs v8 garbage collection beim Aufruf des nativen Addons
das Addon get-String aus js auf diese Weise:
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
}
Gestern fanden wir einen Fehler, der sehr interessant ist. Es ist passiert, wenn der String-Parameter sehr lang ist, für eine FuncParam-String mit der Größe von etwa 400 Bytes oder noch länger, die Anmeldung in Dylib zeigt, dass die Länge von funcParam angekommen 0 ist, während der FuncName auf die gleiche Weise hat die richtige Länge und Inhalt. Nach einigem Debugging habe ich vermutet, dass der String von Garbage-Collected stammen könnte, also habe ich ein String-Objekt erstellt, um das funcParam zu speichern und dann den neuen Zeiger erneut an dylib zu senden, es hat funktioniert!
Meine Frage ist: Wie funktioniert die js-Engine, so dass der String Resource Pointer in js native Addon besuchbar ist, während das native Addon in dylib nicht erreichbar ist?