如何在以结构为参数的Ruby FFI方法中包装函数?

时间:2012-01-24 05:26:49

标签: ruby ffi

我正在尝试使用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文档中描述的任何其他可用类型,那么它会是什么?

1 个答案:

答案 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)