【发布时间】:2016-03-30 06:40:31
【问题描述】:
我目前正在构建一个应用程序(Electron),我需要将它与一个 c++ 库连接起来。我已经使用 NodeJS c++ 插件完成了大部分绑定,但是我缺少一个重要的部分,它与在我的 Javascript 代码上接收 c++ 库生成的事件有关。
void Event1(int64_t id)
{
ArrayBufferAllocator allocator;
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = &allocator;
Isolate* isolate = Isolate::New(create_params);
{
v8::Locker locker(isolate);
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
v8::Local<v8::Value> argv[1] = {
Nan::New("OnWillPlayTrack").ToLocalChecked(), // event name
};
Nan::MakeCallback(isolate->GetCurrentContext()->Global(),"emit", 1, argv);
}
isolate->Dispose();
}
Event1 被 c++ lib 调用,这与 V8 无关,现在我想向 JavaScript 触发一个事件,返回给 Node(EventEmitter?)。 我认为最大的问题是大多数 v8 函数现在都需要一个 Isolate,而且在整个网络上找到的大多数示例都相当陈旧。
Event1 代码在 MakeCallBack 崩溃:
Thread 24 Crashed:: App
0 libnode.dylib 0x000000010a81e35b v8::String::NewFromOneByte(v8::Isolate*, unsigned char const*, v8::String::NewStringType, int) + 43
1 libnode.dylib 0x000000010a4b042f node::OneByteString(v8::Isolate*, char const*, int) + 15
2 libnode.dylib 0x000000010a4ba1b2 node::MakeCallback(node::Environment*, v8::Local<v8::Object>, char const*, int, v8::Local<v8::Value>*) + 50
3 libnode.dylib 0x000000010a4ba240 node::MakeCallback(v8::Isolate*, v8::Local<v8::Object>, char const*, int, v8::Local<v8::Value>*) + 96
4 addon.node 0x0000000110e62e1f Event1(long long) + 291 (v8.h:6721)
任何帮助将不胜感激!
【问题讨论】:
-
这不是重复的。能够在 c++ 插件范围内从 javascript 访问 Node.js
EventEmitter需要我在下面的答案中解释的特定过程。 v8 c++ 插件中的多线程是一个完全不同的问题。
标签: javascript c++ node.js v8 electron