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