Calling JavaScript from C++ with node.js

后端 未结 3 1643
一生所求
一生所求 2020-12-29 05:01

Is there a way to call JS functions from C++ through node.js (as callbacks or something like that)? If yes, how? I\'m searching for it on the web, but haven\'t found any hel

3条回答
  •  情歌与酒
    2020-12-29 05:37

    One way to do it form a native addon can be using the provided function as a callback, for example let's gonna assume that you have a function named setPrintFunction() declared in your native environment (A native addon):

    (Call this for example main.cc)

    #include 
    #include 
    
    v8::Persistent fn;
    
    // Call this at any time, but after the capture!
    void printToNode(std::string msg) {
      auto isolate = fn->GetIsolate();
      // This part is the one that transforms your std::string to a javascript
      // string, and passes it as the first argument:
      const unsigned argc = 1;
      auto argv[argc] = {
          v8::String::NewFromUtf8(isolate,
                              msg.c_str(),
                              v8::NewStringType::kNormal).ToLocalChecked()
      };
      cb->Call(context, Null(isolate), argc, argv).ToLocalChecked();
    }
    
    // This is your native function that captures the reference
    void setPrintFunction(const v8::FunctionCallbackInfo& args) {
      auto isolate = args.GetIsolate();
      auto context = isolate->GetCurrentContext();
      auto cb = v8::Local::Cast(args[0]);
      fn = v8::Persistent::New(cb);
    }
    
    // This part exports the function
    void Init(v8::Local exports, v8::Local module) {
      NODE_SET_METHOD(module, "exports", setPrintFunction);
    }
    
    NODE_MODULE(NODE_GYP_MODULE_NAME, Init)
    

    Then, just importing your addon and using it like:

    (Call this for example index.js)

    const { setPrintFunction } = require('');
    
    function printNodeMsg(msg) {
      console.log(': ' + msg);
    }
    
    setPrintFunction(printNodeMsg);
    

    So what you're basically doing is capturing the reference to the v8::Function (Which is the javascript function, but in the native environment) and then invoking it and passing "Hello World!" as the first (and unique) parameter.

    More on the subject: https://nodejs.org/api/addons.html

提交回复
热议问题