使用 Lua FFI 处理复杂类型
2015-12-21 23:14:28
收藏:0
阅读:78
评论:1
有一个稍微复杂一些的用例……试图通过 C 包装器从 Lua FFI 访问 C++ 对象。
ffi.load("wrapper.so")
ffi.cdef[[
struct puppy;
typedef struct puppy puppy_t;
puppy_t * puppy_bark (const char *encoded);
]]
然而,每次我尝试实例化小狗时,它都会返回“C 类型的大小未知或太大”。
我已经尝试了以下内容来创建小狗...
pup = ffi.typeof("puppy_t")
pup.puppy_bark("some text")
结果是结构体“puppy”没有名为“puppy_bark”的成员。
pup = ffi.new("struct puppy_t")
pup.puppy_bark("some text")
返回“未声明或隐式标记”。
pup = ffi.new("struct puppy puppy_t")
pup.puppy_bark("some stringish thing")
返回“期望 '
假设 C 包装器正确地具有小狗结构、类型和必需的方法,如何创建小狗的实例或指针,以便让它叫?
提前致谢!
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
你问:“我如何创建一个小狗的实例或指针,以使它叫?” - 但是在没有定义的情况下是不可能创建某个东西的实例的,也不可能在没有实例的情况下创建其指针,且你的代码不能使小狗叫(但是有一个全局函数“puppy_bark”可以创建一个新小狗?)。
看起来你可以通过调用
puppy_bark来创建一个小狗(即使这个函数名非常恶劣),但是我不能确定在puppy_bark的实际代码中是否是这样的。既然我没有特定问题的具体答案,这里有一些可能会对你有所帮助的事情:
ffi.new("puppy_t")不起作用,因为FFI需要有struct puppy的定义,而不只是前向声明,出于正好与这种情况在C++中不能这样的原因。struct puppy; puppy *p = new puppy;因此,如果你想这样做,你需要将完整的定义加载到FFI中。注意,LuaJIT的FFI只支持C代码,而不支持C++。
ffi.new("struct puppy_t")不起作用,因为那不是存在的类型。ffi.new("struct puppy puppy_t")不起作用,因为那不是一个有效类型。pup = ffi.typeof("puppy_t") pup.puppy_bark("some text")不起作用,因为puppy_bark不是struct puppy的成员(正如错误消息所告诉你)。看起来你也误解了
ffi.typeof的目的。根据文档,ffi.typeof返回给定类型的构造函数,所以:local new_puppy = ffi.typeof("puppy_t") local puppy = new_puppy(1, 2, 3, 4)等同于
local puppy = ffi.new("puppy_t", 1, 2, 3, 4)如果您想调用全局函数
puppy_bark,可以使用ffi.C.puppy_bark("some text")。