spa*_*ici 4 javascript c++ node.js node-webkit
我正在编写一个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)
Run Code Online (Sandbox Code Playgroud)
每当我调用createVector()方法时,node-webkit在Windows 8上崩溃.我使用以下javascript代码从控制台调用它:
var m=require('vectortest');
m.createVector();
Run Code Online (Sandbox Code Playgroud)
我在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;
}
Run Code Online (Sandbox Code Playgroud)
显然在v8命名空间中.
似乎节点,结果是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);
Run Code Online (Sandbox Code Playgroud)
并且createBuffer返回了arrbuf ArrayBuffer,但是我遇到了问题:数据长度始终为0.相反,通过在c ++代码中创建Uint8Array,行为是对的,我不知道为什么.