Node生成c++插件

参考 C++ 插件

前提:安装了nodejs环境。

全局安装 node-gyp

npm install -g node-gyp

新建 hello.cpp 文件 (.cc/.cpp后缀都是可以的)

相比参考的 在 Node.js 中使用C++,修正了一些编译错误。

#include <node.h>
 
namespace demo{
    using v8::FunctionCallbackInfo;
    using v8::Isolate;
    using v8::Local;
    using v8::Object;
    using v8::String;
    using v8::Value;
    using v8::Number;
    using v8::Context;

    // Method1 实现一个 输出"hello world ONE !" 的方法
    void Method1(const FunctionCallbackInfo<Value>& args){
        Isolate* isolate = args.GetIsolate();
        //args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello world ONE !"));修改如下
        args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello world ONE !").ToLocalChecked());
    }
 
    // Method2 实现一个 加一 的方法
    void Method2(const FunctionCallbackInfo<Value>& args){
        Isolate* isolate = args.GetIsolate();
        Local<Context> context = isolate->GetCurrentContext();
        // 获取参数,js Number 类型转换成 v8 Number 类型 
        Local<Number> value = Local<Number>::Cast(args[0]); 
        // double num = value->NumberValue() + 1;修改如下
        double num = value->NumberValue(context).FromMaybe(0) + 1;
 
        // double 转 char*,这里我不知道有没有其他办法
        char buf[128] = {0};
        sprintf(buf,"%f", num);
 
        args.GetReturnValue().Set(String::NewFromUtf8(isolate, buf).ToLocalChecked());
    }
 
    void init(Local<Object> exports){
        NODE_SET_METHOD(exports, "hello1", Method1);
        NODE_SET_METHOD(exports, "addOne", Method2);
    }
 
    NODE_MODULE(addon, init)
}

新建文件 binding.gyp 

hello.cpp要对应上刚才新建的文件名

{
    "targets": [
        {
            "target_name": "addon",
            "sources": ["hello.cpp"]
        }
    ]
}

执行 ,得到一个 build 文件夹

node-gyp configure

执行,得到build/Release/addon.node 的二进制文件

node-gyp build

js调用.node插件

新建test.js

const addon = require('./build/Release/addon.node');

console.log(addon.hello1());
console.log(addon.addOne(2));

运行test.js

node test.js

electron-vue 调用.node插件

把刚才写在test.js的代码放到electron-vue项目的index.js里。

拷贝addon.node文件到electron-vue项目。

执行 npm run dev 报错 was compiled against a different Node.js version using

Error: Cannot open E:\electronTest\electronVueTest\evtest\addon\addon.node: Error: The module 'E:\electronTest\electronVueTest\evtest\addon\addon.node'
  was compiled against a different Node.js version using
  NODE_MODULE_VERSION 67. This version of Node.js requires
  NODE_MODULE_VERSION 69. Please try re-compiling or re-installing
  the module (for instance, using `npm rebuild` or `npm install`).
      at Object.eval (webpack:///./addon/addon.node?:1:165)
      at eval (webpack:///./addon/addon.node?:2:30)
      at Object../addon/addon.node (E:\electronTest\electronVueTest\evtest\dist\electron\main.js:97:1)
      at __webpack_require__ (E:\electronTest\electronVueTest\evtest\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.js?:39:13)
      at Module../src/main/index.js (E:\electronTest\electronVueTest\evtest\dist\electron\main.js:539:1)
      at __webpack_require__ (E:\electronTest\electronVueTest\evtest\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.dev.js?:11:1)
      at Object../src/main/index.dev.js (E:\electronTest\electronVueTest\evtest\dist\electron\main.js:527:1)
      at __webpack_require__ (E:\electronTest\electronVueTest\evtest\dist\electron\main.js:21:30)

参考 Node in Electron

我本地electron版本是4.2.12(内置node v10.11.0),本地安装node版本是v11.10.0,报错原因就是electron内置node版本与node c++插件所使用的node版本不一致导致的。

 在生成addon.node插件项目里,使用以下命令(注意,不是使用addon.node插件项目里)

参考 关于使用最新版Electron(5.0.5)调用C++插件遇到的一些问题

node-gyp rebuild --target=4.2.12 --arch=x64 --dist-url=https://npm.taobao.org/mirrors/atom-shell

如果修改了hello.cc代码,也是使用这个命令,重新编译出新的addon.node去electron-vue使用就好了。

(注意:这时因为用的node版本已经是11.10.0了,想在addon.node插件项目里使用 node test.js命令验证插件就会报错,这样正常的,因为node命令是用本地安装的node.js版本,本来就与electron内置版本不一致,这里我是备份build来处理的,这样本地验证完后,再切到build_4.2.12打一份给electron-vue项目用)

运行electron-vue,成功

Logo

前往低代码交流专区

更多推荐