我正在用 lua 扩展一个接口,我遇到了一个问题,我需要将指向对象的指针传递给 lua 代码来处理。这些类将通过 SWIG 包装,我可以使用 swig 通过 lua 实例化它们,但这会给我留下无用的对象。
我需要能够将回调对象以及表示事件的对象传递给 lua。我不能手动将回调定义为全局,因为这会引入一个不可接受的约束。
因此,对于一个通用示例,给定一个类 C 和一个带有 1 个参数的 lua 函数,我如何调用该 lua 函数,同时将 C 类型的 C++ 指针传递给它?
啊哈,回答我自己的问题,但我找到了!
http://lua-users.org/lists/lua-l/2007-05/msg00053.html
你好乔伊,
我几乎所有的 SWIG-LUA 工作都是从 lua 端完成的。Swig 非常适合封装一个 C/C++ 库以使其可被 lua 读取。让 C++ 与 lua 对话相当容易,但没有很好的文档记录。
你的想法
lua_pushlightuserdata(
),很接近,但不在那里。你可能想要这样的东西:Foo* p= new Foo(); SWIG_NewPointerObj(L,p,SWIGTYPE_p_Foo,1); lua_setglobal (L, "p");
SWIG_NewPointerObj() 为 foo 对象创建一个用户数据(不是 lightuserdata)并将其推入堆栈。最后一个参数(在本例中为 1)是您是否希望 lua 管理内存(0 表示否,1 表示是)。
和
SWIG_NewPointerObj()
都SWIGTYPE_p_Foo
可以在包装文件中找到。一旦你有了,你应该能够在 lua 中做:
print(p) print(swig_type(p)) p:some_function()
如果您还有其他问题,请告诉我。问候,马克
我没有将 Swig 与 C++ 和 Lua 一起使用,但您可以通过两种不同的方式(用户数据和闭包)在没有 Swig 的情况下使用它。我不知道 Swig 是否会以某种方式干扰这一点。