worldsite / blog.sc

Blogging soul chat, stay cool. via: https://blog.sc
3 stars 0 forks source link

FFI-在JavaScript中调用C++动态链接库 #45

Open suhao opened 1 year ago

suhao commented 1 year ago

如何在JavaScript中调用C++动态链接库

什么是ffi

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

只要传入dll的路径,方法名称,返回值和参数类型,就可以得到一个关于dll中对应方法的代理对象。

接着在这个代理对象上执行对应的方法即可。

ffi原理

node-ffi的原理可以参见下图

image

实际上node-ffi是在libffi之上套了一层壳,将libffi的方法封装成了nodejs的addon

而libffi又调用了系统的API,打开特定的dll(POSIX下dlopen方法/Winodws下LoadLibraryEx方法),并获取对应的方法的地址(POSIX下dlsym方法/Winodws下GetProcAddress方法)。

获得方法对象之后,就可以封装对应的参数,在dll中执行,并获得对应的返回值 image

ffi问题

ffi相较于单独编写nodeaddon的方式简便了不少。

但是也会存在一定的问题。

因此ffi也不是银弹,需要大家在项目中根据实际情况进行考虑

参考文档: