【问题标题】:v8 extracting a global object from nodejs in C++v8 在 C++ 中从 nodejs 中提取全局对象
【发布时间】:2017-10-04 07:38:14
【问题描述】:

我已经使用“--shared”配置选项编译了nodejs。在我的 C++ 代码中,我在节点中启动了一个脚本(在它自己的线程中):

node::Start(argc, argv);

我已执行以下 javascript 将对象放入全局空间:

global.someObject = new SomeObject;

我现在在 C++ 中(在另一个线程上),我想访问全局“someObject”。我一直在考虑使用这些代码,但是隔离变量是 NULL :

     v8::Isolate*  isolate = v8::Isolate::GetCurrent();
     v8::HandleScope scope(isolate);
     auto context = isolate->GetCurrentContext(); // no longer crashes
     auto global_obj = context->Global();
     v8::Local<v8::Value> objinfo = global_obj->GetHiddenValue(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), "someObject"));

有什么建议或想法吗? 如何从 C++ 中的节点获取有效的隔离变量?

【问题讨论】:

  • “在另一个线程上” - 这不起作用,当控制流通过您的代码时,您可以从 javascript 事件循环线程访问它们。如果您正在寻找一种方法来提供一些异步行为,那么您需要集成到 libuv 事件循环中。
  • 很高兴通过创建一个 C++ 函数来做到这一点......但是有一个简单的例子来说明如何做到这一点吗?即注册一个 C++ 回调函数以将全局拉出 nodejs 系统。获取 nodejs 以执行该功能。我想nodejs将对象作为变量传递给c ++函数同样好!
  • 我一直在使用 SWIG 生成插件 - 但是很难弄清楚 SWIG 包装器中发生了什么,也许我应该创建一个自定义 C++ 插件。

标签: javascript c++ node.js v8


【解决方案1】:

您需要从主线程运行isolate-&gt;Exit(),并从另一个线程调用isolate-&gt;Enter()。您还应该使用 v8::Locker 和 v8::Unlocker API。有一些例子here

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 2016-05-09
    • 2017-09-23
    • 2020-04-17
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多