我正在使用FFI gem,以便可以直接从Ruby程序访问C库中的函数。如果C库具有一个接受函数指针参数的函数,并且它具有第二个函数,该函数在该参数中具有正确的签名,那么我如何将指向第二个函数的指针作为第一个函数的参数传递?
到目前为止,这是我尝试过的。为简化起见,我在名为的文件中编写了自己的非常简单的C库bar.c
:
#include <stdio.h>
typedef int bar_func();
int bar1()
{
return 7;
}
int bar2(bar_func * f)
{
printf("f=%p, bar2=%p\n", f, bar1);
return f() + f();
}
我通过运行在Arch Linux下编译了它 gcc -std=gnu99 -fPIC -shared bar.c -o bar.so
我的目标是将指向的指针bar1
作为参数传递给bar2
。我希望bar2
打印两个相同的指针,然后返回14。
因此,我使用Ruby 2.2.0p0和ffi 1.9.6运行了该程序:
require 'ffi'
module Bar
extend ::FFI::Library
ffi_lib './bar.so'
callback :bar_func, [], :int
attach_function :bar1, [], :int
attach_function :bar2, [:bar_func], :int
puts bar2(method(:bar1)) # => 14
end
当我运行程序时,这是我得到的输出:
f=0x7f563ce46000, bar1=0x7f563af7d6e0
14
它给出正确的返回值,但是您可以看到传递到bar2
函数中的函数指针显然不等于bar1
,因为第一行上打印的两个函数指针是不同的。
我在FFI :: Library文档中看到了提示。它说attach_function
返回一个FFI::VariadicInvoker
对象。我做出了一个有根据的猜测,您可以将其传入而不是proc中,并且可以正常工作。
module Bar
extend ::FFI::Library
ffi_lib './bar.so'
callback :bar_func, [], :int
Bar1Invoker = attach_function :bar1, [], :int
attach_function :bar2, [:bar_func], :int
puts bar2(Bar1Invoker) # => 14
end
我得到了期望的输出:
f=0x7f949ed7d6e0, bar1=0x7f949ed7d6e0
14
我已经编辑了FFI Wiki上的“回调”页面以获取此信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句