Как обернуть функцию в методе Ruby FFI, который принимает struct в качестве аргумента? - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь вызвать функцию из общего объекта, используя 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;
}

Проблема в том, как мне объявить функцию с attach_function в Ruby?Как определяется аргумент struct (WHAT w) в списке аргументов в Ruby?Это не указатель: и, похоже, не соответствует ни одному из других доступных типов, описанных в документации ruby-ffi, так что бы это было?

1 Ответ

9 голосов
/ 24 января 2012

Проверьте , как использовать Structs в https://github.com/ffi/ffi/wiki/Structs, для вашего случая:

class What < FFI::Struct
  layout :d, :int,
         :something, :pointer
end

Теперь присоедините функцию , аргумент, поскольку вы передает структуру по значению , будет What.by_value (заменив то, что вы назвали выше классом структуры):

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)
...