2015-12-21 31 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")