Node调用C++(dll)
最近开始搞毕设了,打算用自己拿手的js来搞,但是仿佛入坑了,Node还不是很熟。总之,兵来将挡,水来土掩嘛,带着问题学习才是最高效的。
折腾1:Node 调用 C++
刚开始,虽然我老师把dll文件给我了,但是我一直以为是用Node调用C++,然后一直在折腾怎么编写addon,怎么将C++编译然后用Node调用,未果。。。T_T,还差点在stackoverflow上提问了。。
中途遇到个传参的问题,还搜了好多资料,解决方案:v8 string to char*
但是,再怎么说,也折腾过了,对照着《深入浅出Node.js》中的模块部分,还是理解了不少的。要想走得更远,前面的路是少不了的。
好哒,把步骤写一下吧:
1. 需要 node-gyp
模块
$ npm install node-gyp -g
2. 安装 python
环境
注意: 根据 node-gyp 的GitHub显示,请务必保证你的 python 版本介于 2.5.0 和 3.0.0 之间。
3. 写文件
- binding.gyp
- test.cc
- test.js
具体内容请参考 Node.js调用C/C++
注意:网上搜集的有些博文时间有些久,node 的写法在变,比较老的写法可能会报错,所以,最好去看官网上的例子,如 Hello World例子--官网
4. 编译
$ node-gyp configure
$ node-gyp build
node-gyp configure
命令生成适用于当前平台的构建文件,同时会在 build 目录下生成一个适用于 UNIX 平台的 Makefile 或者适用于 Windows 平台的 vcxproj 文件。调用
node-gyp build
命令会在 build/Release/ 目录下编译生成 addon.node 文件。
5. 运行
$ node test.js
6. 入门例子
6. 参考
折腾2:Node 调用 dll
突然惊觉在 C++ 里调用的是动态链接库dll里面的函数,原来努力方向错了,而且并不需要那么复杂,编译之类的,用VS最恶心的是还得配置各种库,如 boost,我还真是够有耐心的。。。
因此,Google搜索:nodejs调用dll
☛ 步骤如下:
首先参考 Node 调用 C++ 中的环境配置,安装 node-gyp 及 Python 环境
$ npm install node-gyp -g
安装
python
环境:官网注意: 根据 node-gyp 的GitHub显示,请务必保证你的 python 版本介于 2.5.0 和 3.0.0 之间。
安装 node-ffi
$ npm install ffi
☛ 实践:
因为我的 dll 文件只暴露了一个 Query 方法,所以我的 query.js 文件如下:
// query.js
var ffi = require('ffi');
var libm = new ffi.Library(__dirname + '/imagesearcherdll', {
'Query': [
'string', ['string', 'string'] // 方法名:["返回值类型",["参数1类型","参数2类型"]]
]
});
var sketchPath = './public/img/tmp.png',
outputFile = 'result.txt';
libm.Query(sketchPath, outputFile);
最后,执行 node query.js
即可运行。
➹ 参考如下:
通过ffi在node.js中调用动态链接库(.so/.dll文件)
然后又折腾了会,要不就是传参错了,或者路径错了,总之,这些都是小事儿啦,最后,终于成功了!!Node效率果然高!
Node调用C++(dll)的更多相关文章
- c# 调用c++DLL方法及注意事项
引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //voi ...
- 在.net中调用Delphi dll的Pchar转换
Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是De ...
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- C#调用C++ DLL类方法
C++的优势在于高效灵活,C#的优势在于简单易用,两者结合起来对项目开发来说是件好事,而且C++不容易反编译,也保障了代码的安全性,如果一些核心算法使用C#编写,那么保密就是一个问题. C++生成的D ...
- paip.java 调用c++ dll so总结
paip.java 调用c++ dll so总结 ///////JNA (这个ms sun 的) 我目前正做着一个相关的项目,说白了JNA就是JNI的替代品,以前用JNI需要编译一层中间库,现在JNA ...
- C#调用C++ DLL 文件
说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...
- LR调用动态链接库DLL
什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...
- C#调用C++ Dll
现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...
- 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)
OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...
随机推荐
- Flapper Bird的学习笔记(二)
因为有一个超屌的梦想,所以就绝不会做一个孬种的追梦人! 本章节主要目的: 实现小鸟的飞行. 实现管道的随机出现. 实现相机跟随. 上次主要是场景的布置,这节全力拿下代码. 1.小鸟飞行(一种制作2D动 ...
- WebView 的使用----android和html的交互
一.主布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...
- iOS网络推送消息
在iOS项目的appdelegate.m文件中: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOpti ...
- C#之委托
委托是C#中非常重要的一个概念,并在C#中得到了丰富的应用,如事件,线程等.那什么是委托呢?具体来说,委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可 ...
- mysql 自动备份导出到sql
创建一个sh文件 vi mysql_auto.sh写入如下代码 导出单个数据库 /www/wdlinux/mysql/bin/mysqldump -uroot -p123456 database &g ...
- 7个步骤:让JavaScript变得更好
Dan Odell介绍了他编写的七步写出无瑕代码的计划,是在简化过程中最有用的工具. 随着浏览器性能提高,伴随着新的HTML5的编程接口的稳步采用,网页上的JavaScript的音量在逐渐增加.然 ...
- 输入任意一个字符串,如:“abDEe23dJfd343dPOddfe4CdD5ccv!23rr”。取出该字符串中所有的字母。顺序不能改变!并把大写字母变成小写,小写字母变成大写!
package lovo.Linyoujia; import java.util.Scanner; public class Java { @param args public static void ...
- codeforces problem 140E New Year Garland
排列组合题 题意 用m种颜色的彩球装点n层的圣诞树.圣诞树的第i层恰由l[i]个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同.求有多少种装点方案,答案对p取模. 只 ...
- PO VO DAO DTO BO TO概念与区别(转)
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mapping的世界里,有两 ...
- jdbc基本查询方法
jdbc操作数据库时,最基本的三种接口是Statement PreparedStatment CallableStatement (1)Statement createStatement() cre ...