反复从c ++调用node.js函数

我正在尝试设置一个应该能够调用node.js模块一部分的函数的c ++应用程序

虽然我可以find如何创buildnode.js的C ++插件的示例代码,还有一些关于如何从C ++调用V8代码的例子,我没有遇到像从c ++调用node.js函数

我想最好的办法是

  • 设置node.js环境,例如编译所有必要的模块一次
  • 当C ++应用程序需要时,使用参数调用其中一个“可用的”node.js函数
  • 读取并处理函数的返回值

理想情况下,node.js代码和c ++代码在相同的stream程上下文中运行,因此不需要通过某种streamtypes的抽象来编组参数和返回值。

所有提示欢迎!

TX

彼得

我最终设法得到了一些东西

我最挣扎的是如何处理node / v8事件循环,以便在调用javascript函数时启动,而且在javascript函数完成后停止,以便调用c ++方法继续…基本上等待为所有的节点asynchronous处理完成。

简而言之,我所做的就是编辑一个类似于c ++的类

  • 首先初始化节点,就像在node.cc方法Node :: Init和Node :: Start中一样,并传入一个指向节点脚本的参数,该脚本定义了我将要调用的函数

  • 然后在节点的全局名称空间中注册一个C ++函数,该函数将被javascript函数用作最终callback函数。 或多或less

    v8::Locker locker; v8::HandleScope handle_scope; v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); global->Set(v8::String::New("functionCallback"), v8::FunctionTemplate::New(fnCallback,v8::External::Wrap(this))); 
  • 然后调用JavaScript函数

     v8::Handle<v8::Value> value = global->Get(v8::String::New(functionName.c_str())); v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(value); v8::Handle<v8::Value> *v8Args = new v8::Handle<v8::Value>[functionArguments.size()]; for (std::vector<std::string>::const_iterator it = functionArguments.begin(); it != functionArguments.end(); ++it) { int ix = distance(functionArguments.begin(),it); v8Args[ix] = v8::String::New((*it).c_str()); } v8::Handle<v8::Value> fnResult; fnResult = func->Call(global, functionArguments.size(), v8Args); uv_run(uv_default_loop(),UV_RUN_DEFAULT); 
  • 被调用的javascript函数最终调用全局callback是很重要的,如(javascript)

     global.functionCallback(result); 
  • 这个callback函数(c ++)将会存储结果并终止事件循环

     static v8::Handle<v8::Value> fnCallback(const v8::Arguments& args) { ... // Stop node event loop so that the "calling" app continues (loop is started in execFn) uv_stop(uv_default_loop()); ... 

我意识到这有点简单。 如果有人感兴趣,我可以共享c ++类,但是我的c ++ / v8 / node知识是非常有限的,所以我宁愿不要整个发布

彼得