使用复杂类型的Lua FFI

时间:2015-12-21 22:49:12

标签: c lua ffi

一个复杂的用例...尝试通过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 Struct,Type和必需的方法,如何创建一个实例或指向Puppy的指针以使其吠叫?

提前致谢!

1 个答案:

答案 0 :(得分:2)

你问&#34;我如何创建一个实例或指向小狗的指针,以使它吠叫#34; - 但是如果没有它的定义就不可能创建一个东西的实例,并且如果没有它的实例就不可能创建指向某个东西的指针,并且小狗不会吠叫你的代码无论如何(但有一个全局函数puppy_bark创建一个新的小狗?)。

看起来你可以通过调用puppy_bark创建一只小狗(在这种情况下,这是一个非常糟糕命名的函数!),但是如果没有看到{{1}后面的实际代码,我无法确定{1}}。

由于我没有针对特定问题的具体答案,以下是一些可能对您有所帮助的事项:

  1. puppy_bark无法正常工作,因为FFI需要ffi.new("puppy_t")定义,而不仅仅是前向声明,原因完全相同这不会在C ++中起作用:

    struct puppy

    因此,如果要执行此操作,则需要将完整定义加载到FFI中。请注意,LuaJIT的FFI 仅支持C代码,而不支持C ++。

  2. struct puppy; puppy *p = new puppy; 不起作用,因为它不是一种存在的类型。

  3. ffi.new("struct puppy_t")无法工作,因为这不是有效的类型。

  4. 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执行此操作。