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

导读:本篇文章讲解 nodejs ffi-napi调用go生成的dll(参数传递buffer类型,返回值也为buffer),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!