nodejs如何调用c语言 (FFI)


 

最近有个任务需要实现一个算法的nodejs版本,因为这是个签名算法,比较复杂,而且一般情况下,考虑到安全性和效率,都不会使用自己写的签名算法。为了解决这个问题,找了一些资料,可以通过FFI(foreign function interface)来调用c语言的动态链接库。

1.安装

npm install -g node-gyp

npm intall ffi

npm install ref

通过以上命令安装所需要的模块。

2. 代码示范

c语言的动态链接库给出的接口函数:

unsigned char * input(unsigned char * str);

unsigned char * output(unsigned char * str, unsigned char * str1);

c语言中的返回值是 unsigned char * 或者 signed char*时,返回的文本是变化的,与预期不合。 末尾存在大量0x00,因此这里需要人为的截断。

这里弄了好久也没弄好,最后选择的方式修改动态链接库的接口函数,添加一个参数,以确定传入数组的长度。

unsigned char * output(unsigned char * str, unsigned char * str1,int len);

var ffi = require("ffi");

var ref = require("ref");

const refArray = require('ref-array')

const sk = refArray(ref.types.uchar,2604);

const pk = refArray(ref.types.uchar,2065);

var libhel = ffi.Library('./libhelloworld.so',{

    'output':['uchar*',['uchar*','string','int']],

    'input':['uchar*',['string']]

});

var str = "Whatever is worth doing is worth doing well";

var csk = new sk();

var cpk = new pk();

csk = libhel.input(str);

cpk = libhel.output(csk,str,2604);

var libhel = ffi.Library('./libhelloworld.so',{  'output':['uchar*',['uchar*','string','int']],}); 

libhelloworld是c工程的动态链接库, output是c工程定义的函数,第一个uchar* 表示函数的返回值,之后的参数表示函数传入参数的类型。 

  ffi中存在一些内置简写

    ref.types.int => 'int'

    ref.refType('int') => 'int*'

    char* => 'string' 

这里将unsigned char简写成uchar.

这里就简单写,这里就当给自己的一个笔记库,写的很粗略,请见谅。如果有问题,请大家指正。