【electron-vue】创建Nodejs c++插件,并在electron-vue中调用(addon)
Node生成c++插件参考在 Node.js 中使用C++参考C++ 插件全局安装node-gypnpm install -g node-gyp新建 hello.cc 文件#include <node.h>namespace demo{using v8::FunctionCallbackInfo;using v8::Isolate;using v8::Local;using v8::O
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)
我本地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,成功
更多推荐
所有评论(0)