有点复杂的用例...试图通过 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")
结果 struct puppy
没有名为 puppy_bark
的成员
pup = ffi.new("struct puppy_t")
pup.puppy_bark("some text")
返回 undeclared or implicit tag
pup = ffi.new("struct puppy puppy_t")
pup.puppy_bark("some stringish thing")
返回 '<eof>' expected near puppy_t
假设 C Wrapper 正确地具有 Puppy 结构、类型和必要的方法,如何创建 Puppy 的实例或指向 Puppy 的指针以使其吠叫?
提前致谢!
最佳答案
你问“我如何创建一个小狗的实例或指针以让它吠叫”——但是如果没有它的定义就不可能创建一个实例,也不可能创建一个指针没有实例的东西,小狗也不会用你的代码吠叫(但是有一个全局函数 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")
。
关于c - 使用具有复杂类型的 Lua FFI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34405678/