Я пишу надстройку node-webkit c ++, она вылетает каждый раз, когда я пытаюсь создать ArrayBuffer. Следующий код является минимальным примером сбоя.
#include <node.h>
#include <v8.h>
#include <cstring>
using namespace v8;
Handle<Value> createVector(const Arguments& args) {
HandleScope scope;
Handle<ArrayBuffer> a = ArrayBuffer::New(12);
return scope.Close(a);
}
void init(Handle<Object> exports) {
exports->Set(String::NewSymbol("createVector"),
FunctionTemplate::New(createVector)->GetFunction());
}
NODE_MODULE(vectortest, init)
Каждый раз, когда я вызываю метод createVector (), происходит сбой node-webkit в Windows 8.
Я вызываю его из консоли, используя следующий код JavaScript:
var m=require('vectortest');
m.createVector();
Я попробовал это на node-webkit 0.7.2 и 0.7.5. Любое предложение?
Поэтому я решил свою проблему, используя обходной путь ниже.
Handle<Object> createBuffer(void *data, size_t size) {
if (size == 0)
throw "Zero sized data";
Handle<Value> abv = Context::GetCurrent()->Global()->Get(String::NewSymbol("ArrayBuffer"));
Handle<Value> argv[] = { Integer::NewFromUnsigned(size) };
Handle<Object> arrbuf = Handle<Function>::Cast(abv)->NewInstance(1, argv);
void *buffer = arrbuf->GetPointerFromInternalField(0);
memcpy(buffer, data, size);
Handle<Value> ui8av = Context::GetCurrent()->Global()->Get(String::NewSymbol("Uint8Array"));
argv[0] = arrbuf;
Handle<Object> result = Handle<Function>::Cast(ui8av)->NewInstance(1, argv);
return result;
}
Очевидно, в пространстве имен v8.
Кажется, что узел и, как следствие, узел-webkit, повторно реализует ArrayBuffer, TypedArray, Uint8Array и т. Д. В node / src / v8_typed_array.cc. Они полностью отличаются от тех в v8.h, и у них нет заголовочного файла для включения.
Изначально в моем коде JavaScript было что-то вроде этого:
var buffer = ... // call function that in the end call createBuffer
var data = new Uint8Array(buffer);
и createBuffer возвращал arrbuf ArrayBuffer, но у меня были проблемы с этим: длина данных всегда была равна 0. Вместо этого, при создании Uint8Array в коде c ++, поведение правильное, я не знаю почему.
Других решений пока нет …