addon@Node.js之新手上路
最近要写一个addon插件,所以。。。。
准备材料:1.安装python;2.安装开发包(http://nodejs.cn/download/);3.安装vscode(windows版本)/ xcode(MAC版本)
我是在windows下开发,选择vscode。下面的经历都是windows版本,其他系统的忽略
现在网上的材料大部分不适用于新版的node.js。举个例子:新版的参数多了一个v8::Local<v8::Context> context,很多转换都要用到。以前可以直接args[0]->ToString();现在是不允许了。
安装好上述3件宝,将下载的hello范例拉到vscode上,选择nan版本,右键“在继承终端模式打开”,输入(1)>>>npm init
然后(2)>>>npm install nan
(3)>>>npm install node-gyp -g
(4)>>>node-gyp configure
(5)>>>node-gyp build
之后的debug可以选择>>>node-gyp rebuild 取代(5),最后调试>>>node hello.js
上述的hello可以在http://nodejs.cn/api/addons.html看到详细的介绍,我不细说。
搭建好调试环境,接下来就是开动addon定制了。
我这个插件需要调用外部已经写好的DLL,所以要先SetDLLPath(用到windows API "SetDllDirectory"&"GetModuleHandle"&"LoadLibrary"等),网上一堆类似的教程,我不赘述了。js调用可能是
var buf=Buffer.alloc(2048);
buf.write(__dirname+'/dll_path')
addon.jSetDllPath(Object(buf), buf.length)
C++函数SetDLLPath:
void SetDLLPath_C(const Nan::FunctionCallbackInfo<v8::Value>& info)
{
Isolate* isolate = info.GetIsolate();
v8::Local<v8::Context> context = isolate->GetCurrentContext();
Local<Object> out=Local<Object>::Cast(info[0]); //直接Buffer类型就Object
unsigned char *ss = (unsigned char *)node::Buffer::Data(out);
//处理传递的字符串
double arg1 = info[1]->NumberValue(context).FromJust(); //Buffer的大小
//...后面的省略
}
void Init(v8::Local<v8::Object> exports) {
v8::Local<v8::Context> context = exports->CreationContext();
exports->Set(context,
Nan::New("SetDLLPath").ToLocalChecked(),
Nan::New<v8::FunctionTemplate>(SetDLLPath_C)->GetFunction(context).ToLocalChecked());
}
NODE_MODULE(addon, Init)
这样就完成一个函数的对接。我只学Buffer和Number的传递,其他的String之类的完全摸不到边,工程时间急先这样做了。
上述的代码可以看出,js调用的实际上是暴露的接口字符串,和C的函数接口没啥关系,不过我们习惯写法都是将它们统一的(方便复制粘贴^_^)。同时也看出了新版的Buffer转换其实比旧版的要简单,但是Number转换时需要参数content,所谓的上下文。String也是和Number类似的,只不过缓存UTF8有点问题,我还在研究中。。。。
好了,暂时就这么多!
addon@Node.js之新手上路相关推荐
- Node.js 之 新手安装详解 及 npm 配置说明
简介 Node.js 是一个基于Chrome V8 的 JavaScript运行时的平台,可轻松构建快速,可扩展的网络应用程序. Node.js使用事件驱动的非阻塞I/O模型,使其轻量级和高效,非 ...
- 使用napi node_使用Napi / node-addon-api和Cmake的独立于Node.js版本的C ++ Native Addon
使用napi node This is a tutorial for c++ Node-addon-api / Napi addon using cmake.Napi makes it indepen ...
- 如何将命令行参数传递给Node.js程序?
我有一个用Node.js编写的Web服务器,我想使用一个特定的文件夹启动. 我不确定如何在JavaScript中访问参数. 我正在像这样运行节点: $ node server.js folder 这是 ...
- 如何调试Node.js应用程序?
如何调试Node.js服务器应用程序? 现在,我主要使用带有以下打印语句的警报调试 : sys.puts(sys.inspect(someVariable)); 必须有更好的调试方法. 我知道Goog ...
- 如何让服务器运行js,服务器端JavaScript运行环境Node.js的依赖性管理
众所周知,Node.js是一个基于Chrome V8引擎的服务器端JavaScript运行环境.它采用了一种事件驱动的.非阻塞式的I/O模式,运行起来既轻量级又高效.诚然,我们可以使用单个js文件,来 ...
- node mysql await_javascript – node.js async / await与MySQL一起使...
我需要将所有结果同步并附加到带有async / await关键字的字符串,例如c# 我是node.js的新手,我无法将这种新语法适应我的代码. var string1 = ''; var string ...
- Node.js:入门资料
<快速搭建 Node.js 开发环境以及加速 npm> http://fengmk2.com/blog/2014/03/node-env-and-faster-npm.html <N ...
- Node.js module.exports与导出
by lazlojuly 通过lazlojuly Node.js module.exports与导出 (Node.js module.exports vs. exports) 它们是什么,如何使用它们 ...
- 学习 Node.js 的 6 个步骤
学习 Node.js 的 6 个步骤 从刚接触Node.js到现在,自己也是一路摸滚打爬过来的,虽不说是什么高手,但对于如何学习Node.js,还是有一些个人见解,拿出来与大家共勉~ 学习Node.j ...
最新文章
- 美国爱因斯坦计划技术分析
- redirect_uri参数错误解决方法
- 洛谷 P4245 【模板】任意模数NTT
- 不用 pip install,你养我吗?
- Docker与Kubernetes,是敌是友?
- 好的重构方法才能摆脱“屎山”
- 调试利器:浏览器 Logger
- samba安装_Centos安装Samba
- wordpress+lnmp出现 404 Not Found nginx
- 360浏览器清除缓存_手机微信内置浏览器缓存清理指南
- 前大厂员工谈中美企业区别,中企不用单元测试,仅靠QA检查代码?
- 1486mysql,mysql_error.md
- 基于.net平台的Windows窗体应用程序——(已附源码)学生管理系统
- JavaScript常见的网页特效(元素样式相关属性)
- sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- 小程序项目之猫眼案例-代码
- linux运算圆周率代码,计算圆周率pi的代码
- CSS3 2D转换3D转换
- 黑客基础——基础隐写术
- 服务器的垃圾清扫系统指令,求win10清除系统垃圾的几个命令
热门文章
- 如何调整DOSBOX的运行窗口大小
- 国产操作系统突破重围,中兴新支点系统宣布:30万+,并发布服务器模式
- 软件设计分为前端后端吗
- WinSvr:在 Windows Server 中启用无线连接
- 计算机bios设置系统安装教程,z590主板装win7系统及bios设置教程(支持11代cpu驱动)...
- python主题更改_IDLE怎么将主题修改成Darcula样式?
- 中国电商靠低价攻入美国市场,亚马逊已经手足无措
- 2022中国开发者影响力年度榜单揭晓,华为、阿里、腾讯等入选年度开源贡献企业 | 美通社头条...
- 核桃编程python下载_核桃编程for Mac
- Visual Assist 10.9.2248 破解版(支持VS2017)