将非全局的 C++ 对象传递给 Lua 函数(Swig)
2010-3-7 7:22:32
收藏:0
阅读:214
评论:2
我正在使用 lua 扩展接口,并遇到一个问题,我需要将指向对象的指针传递给 lua 代码以进行操作。这些类已经通过 SWIG 进行了封装,我可以使用 swig 在 lua 中实例化它们,但那将给我带来无用的对象。
我需要能够将回调对象传递给 lua,以及表示事件对象的对象。我不能手动定义回调函数为全局变量,因为那会引入不可接受的约束。
因此,以一个通用的例子为例,如果有一个类 C 和一个在 lua 中需要一个参数的函数,我该如何调用该 lua 函数,并同时传递类型为 C 的 C++ 指针?
原文链接 https://stackoverflow.com/questions/2395501
点赞
stackoverflow用户57482
哇,回答了自己的问题,但我找到了它!
http://lua-users.org/lists/lua-l/2007-05/msg00053.html
你好 Joey,
我几乎所有的 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()
创建了一个 userdata(而不是 lightuserdata)用于 foo 对象,并将其推送到堆栈。最后一个参数(在这种情况下为 1)是指你想要 lua 管理内存(为 0 则不需要,为 1 则需要)。
SWIG_NewPointerObj()
和SWIGTYPE_p_Foo
都可以在包装文件中找到。一旦你拥有了它,你就可以在 lua 中做到这一点:
print(p) print(swig_type(p)) p:some_function()
如果你有其他问题,请告诉我。祝好,Mark
2010-03-07 11:24:36
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我没有使用过Swig来处理C++和Lua的代码,但是你可以使用两种不同的方式(userdata和closures)在不使用Swig的情况下实现。我不知道Swig是否会对此造成干扰。
使用Userdata
lua_pushcclosure