使用ffi-napi和NodeJS Buffer创建NodeJs addon

本文介绍了如何使用ffi-napi和NodeJS Buffer创建NodeJS AddOn,强调了NAPI对V8 API的封装,使得addon在不同版本的NodeJS上兼容。讲解了在C++中定义DLL输出函数、设置回调函数到TypeScript代码、处理包含C++函数的回调参数、管理外部开辟的内存指针以及为C++指针变量赋值等特殊案例。
摘要由CSDN通过智能技术生成

创建NodeJS AddOn的方式很多,在NodeJS开发出c/c++ addon with NAPI之后,大家基本上都用NAPI写addon了,最基本的原因就是NAPI可以脱离v8修改的依赖,NAPI对v8中的api进行了封装,不同版本的Node会自动适用v8底层的API变化。

node-ffi-napi是一个开源的module,该模块内部通过nodejs napi加载我们自己写的dll中输出的函数(输出函数必须是extern 'c'的),由于该模块在内部使用了napi,所以我们在下载该模块的时候,会自动对模块进行编译,需要提前安装很多的模块,具体可以参考在不同的系统上怎样编译一个addon。

在使用node-ffi-napi的时候,一般也会使用ref-napi, ref-array-napi, ref-struct-napi,具体这些模块的使用可以参考npm上的readme.

Buffer是NodeJs为管理内存而设计的,Buffer是固定内存长度的byte array,是继承与Javascript 的Uint8Array, 你可以跟JS中的DataView一样去操作Buffer,具体使用可以参考NodeJS网站的说明。

下面介绍一下我在适用ffi-napi和Buffer的几个特殊的例子:

1.dll中的调用约定:

       在定义dll输出函数的时候使用extern 'c', 也就是编译用的c规则,如果是extern 'c++'的话,就是用的c++规则,就会有函数重命名的问题;默认使用的是__cdecl,不要使用__stdcall,因为__stdcall会带出函数参数信息,一般自定义的都不会使用__stdcall,只有windows API定义这样,这样不利于动态输入参数。 

具体可以参考以及微软的说明

// api.h
#define DllAPI __declspec(dllexport)
extern "C" {
    DllAPI void GetTmpStruct(void* buffer);
}

2.在dll中设置回调函数,在c++代码中调用 typescript中的函数,有些特殊情况是一个node程序调用Addon,在addon里面需要调用回调函数,也就是typescript 的code, 需要怎么处理呢?

下面是addon中C++的code:

typedef void (* JsCallBack)(int status, int extendstatus);  //callback
void SetTestCallBack(void* wrapper, JsCallBack pfunc)
	{
		wrapper* p = static_cast<wrapper*> (wrapper);
		p->m_pFuncCallBack = pfunc;
	}

代码段中SetTestCallBack是输出函数,在typescript中通过ffi加载调用。JSCallBack是函数定义类型,也就是在typescript中的定义的函数格式要满足上面的条件.

那么在typescript中要怎么定义呢?

import * as ffi from 'ffi-napi'
import * as ref from 'ref-napi'
class Testify{
    //this callback must be saved in object, so that it will not be removed by nodejs
    private ca
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值