一些操作放到动态库中由c实现,通过调用dll动态库,可以拓展JS的能力。
1、安装依赖
调用动态库需要安装ffi、ref、ref-array三个依赖,注:他们不支持node10以上的node版本。
也可以根据情况安装ffi-napi、ref-napi、ref-array-napi
var ffi = require('ffi');
const ref = require('ref');
const refArray = require('ref-array');
其中,ffi是用来调用动态库的,ref、ref-array是用来类型转换的。因为js中没有c中的int、double、指针等概念。
2、调用动态库
var libxdma = ffi.Library(dll_url, {
})
通过ffi.Library方法调用动态库,
- 第一个参数,是动态库存放的绝对路径
- 第二个参数,是一个对象,写所有接口。
动态库中提供的接口,写到这里面才能调用。
3、接口的写法
假如c中的接口是这么写的:
void fftw_plan_initialization(const int length, double *din, double *dout,int *fft_power_sort_index);
void,表示执行这个方法后没有返回值
它需要传入四个参数,第一个是int类型,第二个和第三个是double类型指针,第四个是int类型指针
var doubleArray = refArray(ref.types.double);
var IntArray = refArray(ref.types.int)
相应地,在js中,接口这么写:
var libxdma = ffi.Library(dll_url, {
'fftw_plan_initialization': ['void', ['int', doubleArray, doubleArray,IntArray]],
})
4、在js中调用接口
对于指针类型,要new一个实例
执行接口方法后,结果在实例中获取。
var length=40960;
var din = new doubleArray(length*2);
var dout = new doubleArray(length*2);
var fft_power_sort_index=new IntArray(length);
libxdma.fftw_plan_initialization(length,din,dout,fft_power_sort_index);