Javascript 从C++;使用node.js 有没有一种方法可以从C++中通过NoDE.js调用JS函数(作为回调或类似的东西)? 如果是,如何进行? 我正在网上搜索,但没有找到任何有用的资源

Javascript 从C++;使用node.js 有没有一种方法可以从C++中通过NoDE.js调用JS函数(作为回调或类似的东西)? 如果是,如何进行? 我正在网上搜索,但没有找到任何有用的资源,javascript,c++,node.js,Javascript,C++,Node.js,提前谢谢你当然可以。例如,如果您想在C++中编写一个简单的阶乘函数,可以执行以下操作 #include <node.h> using namespace v8; int factorial(int n) { if (n == 0) return 1; else return n * factorial(n - 1); } void Factorial(const FunctionCallbackInfo<Value>& args) {

提前谢谢你当然可以。例如,如果您想在
C++
中编写一个简单的阶乘函数,可以执行以下操作

#include <node.h>

using namespace v8;

int factorial(int n) {
    if (n == 0) return 1;
    else return n * factorial(n - 1);
}

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

    if (args.Length() != 2) {
        isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
    } else {
        if (!(args[0]->IsNumber() && args[1]->IsFunction())) {
            isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong arguments type")));
        } else {
            int result = factorial(args[0]->Int32Value());

            Local<Function> callbackFunction = Local<Function>::Cast(args[1]);
            const unsigned argc = 1;
            Local<Value> argv[argc] = { Number::New(isolate, result) };

            callbackFunction->Call(isolate->GetCurrentContext()->Global(), argc, argv);
        }
    }
}

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

NODE_MODULE(Factorial, Init)

答案是肯定的,下面是一种方法:

我创建了一个名为index.js的js文件,下面是该文件的路径

D:\NodeJS\call_js_from_cpp 
它包含以下代码

console.log("hello");

现在我有一个C++代码,执行下面的shell命令,并将输出存储在变量“输出”(这是一个字符串):

这里是C++代码:(注意,在代码中,路径中有两个,因此它变得像这个节点d:\Nojjs\CaljJSyFas-CPP\index .js)

#包括
#包括
#包括
#包括
#包括
std::string ssystem(const char*命令){
字符tmpname[L_tmpnam];
标准:tmpnam(tmpname);
std::string scommand=command;
std::string cmd=scommand+“>>”+tmpname;
std::system(cmd.c_str());
std::ifstream文件(tmpname,std::ios::in);
std::字符串结果;
如果(文件){
而(!file.eof())result.push_back(file.get());
file.close();
}
删除(tmpname);
返回结果;
}
//给cygwin
int main(int argc,char*argv[])
{
std::string bash=“node D:\\NodeJS\\call\u js\u from\u cpp\\index.js”;
std::字符串输入;
std::string s=sssystem(bash.c_str());
标准:istringstream iss;
std::字符串输出;
while(std::getline(iss,输出))
{

std::cout从本机插件中执行此操作的一种方法是使用提供的函数作为回调,例如,假设您在本机环境中声明了一个名为
setPrintFunction()
的函数(本机插件):

(例如称之为
main.cc

#包括
#包括
v8:持续性fn;
//随时打电话,但在抓获之后!
void printToNode(std::string msg){
自动隔离=fn->GetIsolate();
//这部分是将std::string转换为javascript的部分
//字符串,并将其作为第一个参数传递:
常量无符号argc=1;
自动argv[argc]={
v8::String::NewFromUtf8(隔离,
msg.c_str(),
v8::NewStringType::kNormal).ToLocalChecked()
};
cb->Call(上下文,Null(隔离),argc,argv).ToLocalChecked();
}
//这是捕获引用的本机函数
void setPrintFunction(常量v8::FunctionCallbackInfo和args){
自动隔离=args.GetIsolate();
自动上下文=隔离->GetCurrentContext();
auto cb=v8::Local::Cast(args[0]);
fn=v8::Persistent::New(cb);
}
//这部分导出函数
void Init(v8::本地导出,v8::本地模块){
节点设置方法(模块“导出”,设置打印函数);
}
NODE_模块(NODE_GYP_模块名称,Init)
然后,只需导入您的插件并使用它,就像:

(例如称之为
index.js

const{setPrintFunction}=require(“”);
函数printNodeMsg(msg){
console.log(“:”+msg);
}
设置打印功能(printNodeMsg);
因此,您基本上要做的是捕获对
v8::Function
(这是javascript函数,但在本机环境中)的引用,然后调用它并将
“Hello World!”
作为第一个(也是唯一的)参数传递


<> P>关于这个主题:这些链接与OP所问的完全相反。如何调用C++的JS。他指的是另一种方式……从CPP调用JSI认为OP询问关于V8的函数的引用并调用它,而不是从C++应用程序中生成节点进程。@ SIGMASOLDEER,您的意思是在IPC之间建立IPC。C++进程和NoDEJS进程,C++能触发NodeJs函数吗?或者,你的目标是使用C++信号来对付NoDEJS进程来触发这些函数吗?有很多方法可以通过C++调用No.js(作为回调或类似的东西)调用JS函数。按要求,这个似乎是最简单也是最直观的。我想OP是指编写一个本地的Adon,它捕获一个函数的引用,然后调用它。但是无论如何,这都应该被OP所阐明。在C++中,你可以添加一个例子来说明如何使用这个解决方案吗?在这种情况下,将<代码> STD::String 添加到C++中。函数,它将被传递给它的Javascript对应项。我想我得到了您想要的:例如,可以是一个函数,它捕获对另一个函数的引用,然后根据您的意愿,在调用它的本机部分中创建一个函数。这可能是一个可能的解决方案?嗯,当我问这个问题时,我想知道以下几点:假设我有一个JS函数,代码> PrtNoDeMsg(MSG)< /C> >,我想调用它,并将它从C++中传递到<代码> MSG< /Cuff>参数。ADDN不是问题,但是我希望能够传递参数,而不仅仅是调用函数。所以基本上调用C++函数<代码>空隙PrtNoDeMsg(const STD::String和MSG)。
将调用
prontNodeMsg(msg)在JS站点上,传递指定的字符串数据。这个解决方案不是OP的问题吗?@ Abor Apple问如何从C++上下文调用JavaScript创建函数,但是使用节点。因此,据我所知,OP需要一个可以提供JS函数的C/C++程序,以便可以从JS CONT中编制出来。EXT,但在C++程序的过程中使用。
console.log("hello");
node D:\NodeJS\call_js_from_cpp\index.js
#include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>
#include<sstream>

std::string ssystem (const char *command) {
  char tmpname [L_tmpnam];
  std::tmpnam ( tmpname );
  std::string scommand = command;
  std::string cmd = scommand + " >> " + tmpname;
  std::system(cmd.c_str());
  std::ifstream file(tmpname, std::ios::in );
  std::string result;
  if (file) {
   while (!file.eof()) result.push_back(file.get());
   file.close();
  }
  remove(tmpname);
  return result;
}

//for cygwin

int main(int argc, char *argv[])
{
   std::string bash = "node D:\\NodeJS\\call_js_from_cpp\\index.js";
   std::string in;
   std::string s = ssystem(bash.c_str());
   std::istringstream iss(s);
   std::string output;
   while ( std::getline(iss, output) )
    {
      std::cout << output;
    }

   return 0;
 }