c - 使用具有复杂类型的 Lua FFI

标签 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 结构、类型和必要的方法,如何创建 Puppy 的实例或指向 Puppy 的指针以使其吠叫?

提前致谢!

最佳答案

你问“我如何创建一个小狗的实例或指针以让它吠叫”——但是如果没有它的定义就不可能创建一个实例,也不可能创建一个指针没有实例的东西,小狗也不会用你的代码吠叫(但是有一个全局函数 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")

    <

关于c - 使用具有复杂类型的 Lua FFI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34405678/

相关文章:

有人可以帮助解释这个 fft 代码片段中发生了什么

sockets - 有没有办法在魔兽世界 Lua 脚本中使用套接字?

c++ - flutter :即使 shouldRepaint() 返回 true,自定义画家也不会重新绘制

python - 比较 Python 中的 C 指针

haskell - 在 Windows 上使用 HsLua 出现链接错误

python - 仅使用随机数的有趣任务

c - 使用文件对话框获取路径

c - 为什么我在 C 中有一个不兼容的指针类型?

lua - 在Torch中将表写入文件

c++ - 为 C++ 选择嵌入式脚本语言