NodeJS - C / C ++插件通信(stdin stdout)

时间:2015-07-06 13:07:09

标签: c++ c node.js

我正在尝试将音频流传递给C / C ++ Addon。但首先我想了解并实现一些基本的例子。整个目标是使用stdin和stdout在nodeJS和插件之间管道信息。 在nodejs中,我可以看到带有此代码的标准输出:

var fs = require('fs');
var readableStream = fs.createReadStream('file.txt');
var data = '';

readableStream.on('data', function(chunk) {
    data+=chunk;
});

readableStream.on('end', function() {
    console.log(data);
});

但是现在,我怎样才能将它传递给c / c ++插件?

3 个答案:

答案 0 :(得分:0)

您无法直接将数据从NodeJS传递到C ++。您可以用C ++编写/开发自己的Node插件/模块,它将一些函数暴露给(Node)JS然后将数据传递给这些函数:

var myModule = require('mymodule'); // The Node addon you wrote    
myModule.processData(data);

现在,processData从JS接收数据,它是一个C ++实现,所以你去。

答案 1 :(得分:0)

以下是在Linux中创建本机插件的示例。希望这会有所帮助:

#include <node.h>
using namespace v8;

void foo(const FunctionCallbackInfo<Value>& args) {

// extract the parameter(s)
int value = args[0]->NumberValue();
// do stuff with value.

//optionally, return a value.
args.GetReturnValue().Set(value + 10);
}


void init(Handle<Object> exports) {
  NODE_SET_METHOD(exports, "processData", foo);
}
NODE_MODULE(addon, init)

构建:Linux(ia32): g ++ -I./deps/v8/include -I./src -shared -m32 -o mymodule.node mymodule.cc

  1. NODE_MODULE宏指示节点注册名为&#39; mymodule&#39;并导出一个名为&#39; processData&#39;的方法。它内部映射到&#39; foo&#39;
  2. 这使得JS空间和方法调用的C ++空间之间的握手。
  3. 现在您可以打电话给&#39; processData&#39;正如marekful所说。

答案 2 :(得分:0)

假设nodejs脚本:

var addon = require('./build/Debug/addon.node');
var fs = require('fs');
var readableStream = fs.createReadStream('file.txt');
var data = '';

readableStream.on('data', function(chunk) {
    data+=chunk;
});

readableStream.on('end', function() {
    console.log("loaded");
    console.log('addon invocation:', addon.read_stream(data));
});

此脚本可以加载文件信息:

#include <node.h>
#include <iostream>
#include <string>

using namespace v8;
using namespace std;

void read_stream(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = Isolate::GetCurrent();
  HandleScope scope(isolate);

  if (args.Length() < 1) {
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Wrong number of arguments")));
    return;
  }

  v8::String::Utf8Value param1(args[0]->ToString());
  std::string auxiliar = std::string(*param1); //JS---->C++

}


void Init(Handle<Object> exports) {
  NODE_SET_METHOD(exports, "read_stream", read_stream);
}

NODE_MODULE(addon, Init)

在调试&#34;辅助&#34; string将包含&#34; file.txt&#34;的文本。现在是时候尝试使用wav文件了。