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

Pet*_*ter 4 c++ v8 node.js

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

虽然我可以找到关于如何为node.js创建C++插件的示例代码,还有一些关于如何从C++调用V8代码的示例,但我没有遇到类似于从c ++调用node.js函数的问题.

我想理想的方法是

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

理想情况下,node.js代码和c ++代码在相同的进程上下文中运行,因此不必对参数进行编组并通过某种流类型的抽象返回值.

欢迎所有提示!

TX

彼得

Pet*_*ter 6

我终于成功了

我最挣扎的是如何处理node/v8事件循环,以便在调用javascript函数时启动它,但也在javascript函数完成时停止,以便调用c ++方法继续....基本上等待用于完成所有节点异步处理.

简单地说,我所做的就是编辑一个c ++类,它可以完成某些工作

  • 首先初始化节点,非常类似于node.cc方法Node :: Init和Node ::启动并传入一个参数,该参数指向定义我想要调用的函数的节点脚本

  • 然后在节点的全局命名空间中注册一个C++函数,该函数将被javascript函数用作最终回调.或多或少喜欢

    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)));
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后调用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);
    
    Run Code Online (Sandbox Code Playgroud)
  • 重要的是调用的javascript函数最终调用全局回调,如(javascript)

    global.functionCallback(result);
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后,此回调(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());
    ...
    
    Run Code Online (Sandbox Code Playgroud)

我意识到这有点简洁.如果有人感兴趣我可以分享c ++类,但我的c ++/v8/node知识非常有限,所以我不想完全发布它

彼得