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
4v8::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
10v8::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)
1global.functionCallback(result);这个回调(c++)将存储结果并终止事件循环。
1
2
3
4
5static 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/节点知识是非常有限的,所以我宁愿不把它全部发布。
彼得