一个复杂的用例...尝试通过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的指针以使其吠叫?
提前致谢!
答案 0 :(得分:2)
你问&#34;我如何创建一个实例或指向小狗的指针,以使它吠叫#34; - 但是如果没有它的定义就不可能创建一个东西的实例,并且如果没有它的实例就不可能创建指向某个东西的指针,并且小狗不会吠叫你的代码无论如何(但有一个全局函数puppy_bark
创建一个新的小狗?)。
看起来你可以通过调用puppy_bark
创建一只小狗(在这种情况下,这是一个非常糟糕命名的函数!),但是如果没有看到{{1}后面的实际代码,我无法确定{1}}。
由于我没有针对特定问题的具体答案,以下是一些可能对您有所帮助的事项:
puppy_bark
无法正常工作,因为FFI需要ffi.new("puppy_t")
的定义,而不仅仅是前向声明,原因完全相同这不会在C ++中起作用:
struct puppy
因此,如果要执行此操作,则需要将完整定义加载到FFI中。请注意,LuaJIT的FFI 仅支持C代码,而不支持C ++。
struct puppy;
puppy *p = new puppy;
不起作用,因为它不是一种存在的类型。
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
执行此操作。