如何通过 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 函数推入该函数指针。