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