我有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
答案 0 :(得分:2)
处理此问题的最简单方法是简单地公开一个调用该函数指针的函数:
SIMPLEFUNC foo = NULL;
int call_foo(int i) {return foo(i);}
这当然会在您的.i
文件中。你不想直接把它暴露给C;它只是Lua的一个帮手功能。
可能有更直接的方法来处理SWIG。也许一些类型图构造或某些。但这是最简单的方法。此外,它不像SWIG允许你将Lua函数推送到该函数指针。