当我在c ++ add-on中创build一个ArrayBuffer时,node-webkit崩溃

我正在编写一个node-webkit c + +附加组件,每当我尝试创build一个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。 任何build议?

所以我解决了我的问题,使用下面的解决方法。

 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的命名空间中。
看来node和node-webkit在node / src / v8_typed_array.cc中重新实现了ArrayBuffer,TypedArray,Uint8Array等等。 它们与v8.h中的完全不同,它们没有包含头文件。
最初,我在我的JavaScript代码是这样的:

 var buffer = ... // call function that in the end call createBuffer var data = new Uint8Array(buffer); 

createBuffer正在返回arrbuf ArrayBuffer,但是我遇到了这样的问题:数据长度始终是0.相反,通过在c ++代码中创buildUint8Array,行为是正确的,我不知道为什么。