如何通过 SWIG 绑定在 Lua 中使用函数指针调用函数?
How do you call functions using function pointers in Lua with SWIG binding?
我的 C 代码如下所示:
typedef int (*SIMPLEFUNC)(int);
SIMPLEFUNC foo = NULL;
void setup_foo(void) {
foo = ...;
}
我用带有基本 .i 文件的 SWIG 包装它,然后可以在 Lua 中使用它。我可以从 Lua 呼叫 setup_foo()
。我可以看到变量 foo
。但是我无法从 Lua 调用 foo
作为函数。它显示为用户数据。
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
处理这个问题的最简单方法是简单地公开调用该函数指针的函数:
SIMPLEFUNC foo = NULL;
int call_foo(int i) {return foo(i);}
这当然会在您的 .i
文件中。您不想直接将其公开给 C;它只是 Lua 的辅助函数。
SWIG 可能有更直接的处理方法。也许是一些类型映射构造或类似的东西。但这是最简单的方法。此外,SWIG 不允许您将 Lua 函数推入该函数指针。
我的 C 代码如下所示:
typedef int (*SIMPLEFUNC)(int);
SIMPLEFUNC foo = NULL;
void setup_foo(void) {
foo = ...;
}
我用带有基本 .i 文件的 SWIG 包装它,然后可以在 Lua 中使用它。我可以从 Lua 呼叫 setup_foo()
。我可以看到变量 foo
。但是我无法从 Lua 调用 foo
作为函数。它显示为用户数据。
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
处理这个问题的最简单方法是简单地公开调用该函数指针的函数:
SIMPLEFUNC foo = NULL;
int call_foo(int i) {return foo(i);}
这当然会在您的 .i
文件中。您不想直接将其公开给 C;它只是 Lua 的辅助函数。
SWIG 可能有更直接的处理方法。也许是一些类型映射构造或类似的东西。但这是最简单的方法。此外,SWIG 不允许您将 Lua 函数推入该函数指针。