javascript - 当我在 C++ 附加组件中创建 ArrayBuffer 时,node-webkit 崩溃

标签 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)

每次我在 Windows 8 上调用 createVector() 方法时,node-webkit 都会崩溃。 我使用以下 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 命名空间中。
似乎 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++ 代码中创建 Uint8Array,行为是正确的,我不知道为什么。

关于javascript - 当我在 C++ 附加组件中创建 ArrayBuffer 时,node-webkit 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19186452/

相关文章:

java - UDP 数据报 Socket 编程与服务器在 JAVA 和客户端在 C++

java - 如何安装 Java Access Bridge?

javascript - 表单提交后是否重定向?

javascript - 使用 AdWords API 获取关键字建议

javascript - 一种使用相同代码将 SVG 或光栅图形居中的方法?

javascript - 限制 Google 自定义搜索引擎中的日期范围

node.js - Jade 扩展不支持express.js

javascript - 将指令的隔离范围绑定(bind)到 Controller 范围的内部对象

c++ - 将 IP 地址从 sockaddr 转换为 in_addr

node.js - 如何强制 NPM 使用本地托管的注册表