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版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...
随机推荐
- DNS bind子域授权安装
失败经验:rhel 6.x bind 9.8,两台做子域授权,最后失败.原因不详. 改用rhel 5.5, bind 9.3,同样的配置,就成功了.具体记录一下9.3的配置. 安装:采用安装RHEL时 ...
- spark示例
1)java(App.java) package com.ejiajie.bi.hello; import org.apache.spark.api.java.JavaSparkContext; im ...
- Android 组件属性
属性名称 描述 android:background 设置背景色/背景图片.可以通过以下两种方法设置背景为透明:”@android:color/transparent”和”@null”.注意TextV ...
- 更新证书错误:No matching provisioning profiles found
在Xcode中当你在更新了你得证书而再重新编译你的程序,真机调试会出现“Your build settings specify a provisioning profile with the UUID ...
- Log4J详解
Log4J 简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...
- Android Build System
归类一些Android build system 相关的知识. http://elinux.org/Android_Build_System make <local_module> - m ...
- 执行时关闭标识位 FD_CLOEXEC 的作用
首先先回顾 apue 中对它的描述: ① 表示描述符在通过一个 exec 时仍保持有效(书P63,3.14节 fcntl 函数,在讲 F_DUPFD 时顺便提到) ② 对打开文件的处理与每个描述符的执 ...
- as3 中文转拼音
private static const PinYin:Object = {"a":"\u554a\u963f\u9515","ai":&q ...
- LLDB, iOS调试器
breakpoint set -s "" breakpoint set -M <method> ( --method <method> ) -S ...
- mysql入门1
进入mysql数据库:进入mysql安装时的目录bin文件夹内