Вызов C обратного вызова из Ruby с использованием SWIG - PullRequest
2 голосов
/ 27 апреля 2011

Я пытаюсь создать привязки для библиотеки C к Ruby через SWIG (2.0.3). Скажем, у нас есть прототип функции в C, который гласит:

void do_sth_and_call_me_then( (int)(* my_callback)(GlyQuery *, GlyMemCache *))

Это сделает некоторые странные вещи и в конце концов вызовет обратный вызов:

int my_callback(GlyQuery * a, GlyMemCache * b)

указан как параметр несколько раз. Поскольку это обычный способ общения с библиотекой, я хочу иметь такое поведение и в Ruby. Во время исследования я обнаружил это , и это почти то, что мне нужно:

%{
void
wrap_callback(void *user_data, const char *other_data)
{
  VALUE proc = (VALUE)user_data;
  rb_funcall(proc, rb_intern("call"), 1, rb_str_new2(other_data));
}
%}

К сожалению, я не могу понять, что мне нужно изменить, чтобы это работало с объектами, отличными от строк.

Если вам нужна дополнительная информация: весь интерфейсный файл здесь

Любой совет? Спасибо за любую помощь.

1 Ответ

1 голос
/ 27 апреля 2011

Вам следует создать оболочку функции обратного вызова, поскольку библиотека C не может напрямую вызывать функцию ruby.

В этой оболочке вы должны преобразовать Structs во что-то, что вы можете передать в код ruby, потому что ruby ​​не может работать напрямую со структурами C.

Существует решение, которое позволяет ruby-коду получать доступ к структурам C, описанным здесь. Обертывание C структур с SWIG

...