ffi 是Foreign Function Interface的简称,是一款nodejs的addon。
可以让大家在nodejs中调用c风格的c++动态链接库
ffi调用起来非常简单,可以看下官网的这个例子
var ffi = require('ffi-napi');
var libm = ffi.Library('libm', {
'ceil': [ 'double', [ 'double' ] ]
});
libm.ceil(1.5); // 2
// You can also access just functions in the current process by passing a null
var current = ffi.Library(null, {
'atoi': [ 'int', [ 'string' ] ]
});
current.atoi('1234'); // 1234
如何在JavaScript中调用C++动态链接库
什么是ffi
ffi 是Foreign Function Interface的简称,是一款nodejs的addon。
可以让大家在nodejs中调用c风格的c++动态链接库
ffi调用起来非常简单,可以看下官网的这个例子
只要传入dll的路径,方法名称,返回值和参数类型,就可以得到一个关于dll中对应方法的代理对象。
接着在这个代理对象上执行对应的方法即可。
ffi原理
node-ffi的原理可以参见下图
实际上node-ffi是在libffi之上套了一层壳,将libffi的方法封装成了nodejs的addon
而libffi又调用了系统的API,打开特定的dll(POSIX下dlopen方法/Winodws下LoadLibraryEx方法),并获取对应的方法的地址(POSIX下dlsym方法/Winodws下GetProcAddress方法)。
获得方法对象之后,就可以封装对应的参数,在dll中执行,并获得对应的返回值![image](https://user-images.githubusercontent.com/24261214/183862339-853a9100-b04c-4ebb-b091-777ea0a02fdd.png)
ffi问题
ffi相较于单独编写nodeaddon的方式简便了不少。
但是也会存在一定的问题。
因此ffi也不是银弹,需要大家在项目中根据实际情况进行考虑
参考文档: