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

Repeatedly calling a node.js function from c++

我正在尝试建立一个C++应用程序,它应该能够调用NoDE.js模块的一个函数。

虽然我能找到关于如何为NoDE.js创建C++插件的示例代码,也有一些关于如何从C++调用V8代码的例子,但我没有运行过类似于从C++调用NoDE.js函数的事情。

我想理想的方法是

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

理想情况下,NoDE.js代码和C++代码运行在同一进程上下文中,因此不必在某些流抽象类型上使用MARLURE参数和返回值。

欢迎使用所有提示!

德克萨斯州

彼得


我终于有了进展

我最努力的是如何处理节点/V8事件循环,以便在调用JavaScript函数时启动,但当JavaScript函数完成后,停止调用C++方法……基本上等待所有节点异步处理完成。

简要地说,我所做的是编辑一个C++类,该类可以沿着

  • 首先初始化节点,类似于node.cc方法node::init和node::start,并传入一个指向节点脚本的参数,该脚本定义了我要调用的函数

  • 然后在节点的全局命名空间中注册一个C++函数,它将被JavaScript函数用作最终回调。差不多

    1
    2
    3
    4
    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函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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函数最终调用全局回调非常重要,如(javascript)

    1
    global.functionCallback(result);
  • 这个回调(c++)将存储结果并终止事件循环。

    1
    2
    3
    4
    5
    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/节点知识是非常有限的,所以我宁愿不把它全部发布。

彼得