我正在尝试使用ruby-ffi从共享对象调用函数。我将以下内容编译成共享对象:
#include <stdio.h>
typedef struct _WHAT {
int d;
void * something;
} WHAT;
int doit(WHAT w) {
printf("%d\n", w.d);
return w.d;
}
问题是,如何在Ruby中使用attach_function
声明该函数?如何在Ruby中的参数列表中定义struct参数(WHAT w)?它不是:指针,并且似乎不适合ruby-ffi文档中描述的任何其他可用类型,那么它会是什么?
答案 0 :(得分:9)
根据您的情况检查https://github.com/ffi/ffi/wiki/Structs中如何使用Structs :
class What < FFI::Struct
layout :d, :int,
:something, :pointer
end
现在附加函数,参数,因为你按值传递结构,将是What.by_value
(取而代之的是什么你有什么命名为上面的struct class:
attach_function 'doit', [What.by_value],:int
现在如何调用函数:
mywhat = DoitLib::What.new
mywhat[:d] = 1234
DoitLib.doit(mywhat)
现在是完整的文件:
require 'ffi'
module DoitLib
extend FFI::Library
ffi_lib "path/to/yourlibrary.so"
class What < FFI::Struct
layout :d, :int,
:something, :pointer
end
attach_function 'doit', [What.by_value],:int
end
mywhat = DoitLib::What.new
mywhat[:d] = 1234
DoitLib.doit(mywhat)