gpt4 book ai didi

C 函数将函数作为参数传递,如何使用 node-ffi 包装此函数?

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:32 24 4
gpt4 key购买 nike

我正在尝试使用 node-ffi 包装 C 代码。但是一个 c 函数在参数中调用一个函数,我在网上搜索但没有得到任何正确的方法来使用 node-ffi 包装相同的函数。

这是我之前尝试过的(片段),

例子.js

var intPin = 40;
var state = 0;
var lib = require('./c_functions');
lib.c_functions.attachInterrupt(intPin,abc); //attachInterrupt is a c function and **Problem 1**

function abc(){
console.log("state: ",state);
state++;
}

c_functions.js//文件访问库并导出函数

var ffi = require('ffi');     //requires to use node-ffi functionalities
var ref = require('ref'); //reference to integer type
var int = ref.types.int;
var voidtype = ref.types.void;
var objPtr = ref.refType(voidType); //void pointer

var c_functions = ffi.Library('/usr/local/lib/lib.so.0.5.0', { //accessing so file
"attachInterrupt":[voidtype, [int,objPtr]] // **Problem 2**
});
/**
* @breif Definitions for Pin modes
*/
var INPUT = 0;
var OUTPUT = 1;
/**
* @breif Definitions for pin values
*/

var LOW = 0;
var HIGH = 1;

module.exports = {c_functions , HIGH, LOW, INPUT, OUTPUT}; //exporting functions

所以我有两个问题,

<强>1。问题 2(在代码中)- attachInterrupt 函数的第二个参数的类型应该是什么?

<强>2。问题 1(在代码中)- 如何调用作为参数传递的函数?

请帮忙!谢谢。

最佳答案

我想你要找的是ffi.Callback()它基本上返回一个可以传递给 C 函数的指针:您的问题的解决方案看起来像这样(example.js):

const intPin = 40;
const state = 0;
const lib = require('./c_functions');

const abc = () => {
console.log("state: ",state);
state++;
}

const pointerToMyFunction = ffi.Callback('void', [], abc);

//now pass pointer of abc() to attachInterrupt function
lib.c_functions.attachInterrupt(intPin,pointerToMyFunction);

ffi.Callback 接受返回类型、参数类型和 javascript 函数作为参数并返回指向该函数的指针。我将空数组作为第二个参数传递,因为 abc() 不接受任何内容。您可以在上面的链接中看到更多示例。

(也尝试使用 constlet 而不是 var :d)

关于C 函数将函数作为参数传递,如何使用 node-ffi 包装此函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58091811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com