使用SWIG从Ruby调用C回调

时间:2011-04-27 14:15:22

标签: c ruby binding swig

我正在尝试通过SWIG(2.0.3)为C库创建绑定到Ruby。 比如说,我们在C中有一个函数原型,它的内容如下:

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

这会做一些奇怪的事情并最终调用回调:

int my_callback(GlyQuery * a, GlyMemCache * b)

多次作为参数。由于这是与库交谈的常用方式,我也希望在Ruby中也有这种行为。在研究的过程中,我发现了this,这正是我所需要的:

%{
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));
}
%}

可悲的是,我无法弄清楚我必须改变什么才能使其与字符串以外的对象一起使用。

如果您需要更多信息:整个界面文件为here

有什么建议吗? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

你应该创建一个回调函数的包装器,因为C库不能直接调用ruby函数。

在这个包装器中,您应该将Structs转换为可以传递给ruby代码的东西,因为ruby不能直接使用C结构。

有一个解决方案允许ruby代码访问C结构,如下所述 Wrapping C structs with SWIG