nodejs ffi-napi调用go生成的dll(参数传递buffer类型,返回值也为buffer)

nodejs ffi-napi调用go生成的dll(参数传递buffer类型,返回值也为buffer)

什么是node-ffi?

node-ffi是使用纯JavaScript加载和调用动态库的node addon,它可以用来在不写任何C++代码的情况下调用动态链接库的API 接口。

ffi究竟干了什么?其实它本质上还是一个编译后的Node addon,node_modules/ffi/build/Release/ffi_bindings.node, ffi_bindings.node就是一个addon ffi充当了nodejs和dll之间的桥梁。

下面是一个简单的加载dll的demo实例:

var ffi = require('ffi');
var libpath = path.join(_dirname, '/test.dll');
var testLib = ffi.Library(libpath, {
	'start': ['bool', ['bool']]
});

testLib.start(true); // true

实操

也不废话多说了,直接开始吧!!!

nodejs篇

版本

首先肯定要先搞出笔者的所有配置版本,不然可能很多读者在边看文章,发现同样的步骤结果处处报错,而笔者这么好像没怎么有问题

"ffi-napi": "^4.0.3",
"ref-array-napi": "^1.2.2",
"ref-napi": "^3.0.3",
"ref-struct-napi": "^1.1.1"

在这里插入图片描述
在这里插入图片描述

安装

yarn add ffi-napi@^4.0.3 ref-array-napi@^1.2.2 ref-napi@^3.0.3 ref-struct-napi@^1.1.1

nodejs代码

function toInt8Arr(str) {
    const buffer = [];
    for (let i of str) {
        const _code = i.charCodeAt(0);
        if (_code < 0x80) {
            buffer.push(_code);
        } else if (_code < 0x800) {
            buffer.push(0xc0 + (_code >> 6));
            buffer.push(0x80 + (_code & 0x3f));
        } else if (_code < 0x10000) {
            buffer.push(0xe0 + (_code >> 12));
            buffer.push(0x80 + ((_code >> 6) & 0x3f));
            buffer.push(0x80 + (_code & 0x3f));
        }
    }
    return Int8Array.from(buffer);
}
const path = require('path')
const ffi = require('ffi-napi');
const ref = require('ref-napi');
//对应*C.char
var stringPointer = ref.refType(ref.types.CString);
var charPointer = ref.refType('char');

const libm = ffi.Library(path.resolve("add.dll"), {
    'Test': ["string", [stringPointer, 'int']],
});
var data = Buffer.from("hello world")
console.log(toInt8Arr("hello world"));
const result = libm.Test(data, 11);
console.log(result)
console.log(Buffer.from(result));

在这里插入图片描述

go篇

main.go

/*
 * @Description:
 * @Version: 1.0
 * @Autor: solid
 * @Date: 2022-08-24 18:37:22
 * @LastEditors: solid
 * @LastEditTime: 2022-11-15 12:25:15
 */
package main

import "C"
import (
	"fmt"
	"unsafe"
)

//export Test
func Test(fp *C.char, l C.int) *C.char {
	filePath := C.GoString(fp)
	CfilePath := unsafe.Pointer(C.CString(filePath))
	data := C.GoBytes(CfilePath, l)
	fmt.Println(data)
	// data := []byte(filePath)[:len]
	return C.CString(string(data))
}
func main() {
}

打包成dll

go build -buildmode=c-shared -o add.dll main.go

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值