如何使用SWA绑定在Lua中使用函数指针调用函数?

时间:2016-03-17 04:26:52

标签: c lua swig

我有C代码,如下所示:

typedef int (*SIMPLEFUNC)(int);

SIMPLEFUNC foo = NULL;

void setup_foo(void) {
    foo = ...;
}

我使用一个简单的.i文件用SWIG封装它,然后可以在Lua中使用它。我可以从Lua打电话给setup_foo()。我可以看到变量foo。但我无法将foo作为Lua的函数调用。它显示为userdata。

local mylib = require('mylib')
mylib.setup_foo()
print(mylib.foo)
print(mylib.foo(3))

我得到这样的输出:

setup_foo() has been called
userdata: 0x1b441c8
PANIC: [string "bootstrap0"]:86: attempt to call a userdata value (field 'foo')
stack traceback:
    [string "bootstrap0"]:86: in main chunk

问题

使用SWIG时,有没有办法从我的Lua代码中调用foo等函数指针?

是否有一些可能有帮助的SWIG配置?

如果没有,修改我的C代码以使其有效的最佳方法是什么?

修改

在更高级别,我通过切换到Selene而不是SWIG解决了这个问题。 Selene允许在运行时轻松地在Lua状态中重新绑定函数。 https://github.com/jeremyong/Selene

1 个答案:

答案 0 :(得分:2)

处理此问题的最简单方法是简单地公开一个调用该函数指针的函数:

SIMPLEFUNC foo = NULL;

int call_foo(int i) {return foo(i);}

这当然会在您的.i文件中。你不想直接把它暴露给C;它只是Lua的一个帮手功能。

可能有更直接的方法来处理SWIG。也许一些类型图构造或某些。但这是最简单的方法。此外,它不像SWIG允许你将Lua函数推送到该函数指针。