2015-12-21 182 views
0

复杂用例的位...试图通过C封装器访问Lua FFI中的C++对象。使用复杂类型的Lua FFI

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包装器正确地有一个Puppy Struct,Type和必要的方法,如何创建一个Puppy的实例或指向Puppy的指针以使其成为树皮?

在此先感谢!

+0

你是如何实例化一只小狗的? – immibis

+0

只需添加一些例子 –

回答

2

你问“如何创建一个小狗的实例或指针来使它成为树皮” - 但是不可能创建一个没有定义的东西的实例,也不可能创建一个指向没有它的实例的东西,而且小狗也不会用你的代码吠叫(但是有一个全局函数puppy_bark可以创建一个新的小狗?)。

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

由于我没有具体回答一个具体的问题,这里有一些事情是有可能帮助你:

  1. ffi.new("puppy_t")不起作用,因为FFI需要有定义的struct puppy,而不仅仅是一个向前声明,对于完全相同的原因,这不会在C++的工作:

    struct puppy; 
    puppy *p = new puppy; 
    

    所以,如果你想做到这一点,你需要将完整的定义加载到FFI。请注意,LuaJIT的FFI 仅支持C代码,而不支持C++。

  2. ffi.new("struct puppy_t")不起作用,因为这不是存在的类型。

  3. ffi.new("struct puppy puppy_t")不起作用,因为这不是有效的类型。

  4. 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")