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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/61494.html