如何将Lua字符串转换为C char*?

5

我使用了luajit ffi库来封装一个包含在C库中的在ppm文件上绘制文本的函数:

void drawText(frameBuffer *fb, int px, int py, char* text, pixel color) 

当我尝试使用字符串从Lua调用它时,我会得到这个错误:bad argument #4 to 'drawText' (cannot convert 'string' to 'char *')。 Lua字符串库似乎没有任何东西可以将整个字符串转换为字节数组或我可以充分操作的任何内容。
有没有什么提示可以在不修改C代码的情况下在Lua端完成此操作?

你看过API文档了吗? - wallyk
我正在使用LuaJIT ffi库,但那里的文档并不是很有帮助。 - BarFooBar
2个回答

11

如果一个 ffi 函数期望一个 char*,那么你不能直接将 Lua 的 string 传递给它。你需要先将 Lua 的 string 转换为 char*。要做到这一点,可以使用 ffi.new 创建一个新的 C string 变量,然后将 Lua string 变量的内容复制到这个新的 C string 变量中。例如:

local text = "text"
-- +1 to account for zero-terminator
local c_str = ffi.new("char[?]", #text + 1)
ffi.copy(c_str, text)
lib.drawText(fb, px, py, c_str, color)

11

或者,重写您的C函数以接受const char*而不是char*。然后,您可以直接使用LuaJIT字符串,无需首先为它们分配缓冲区。

这意味着该函数无法修改传递的字符串,但在大多数函数中,您通常也不会这样做。如果您希望传递字符串字面量(因为它们是const char*类型),则在较新版本的C中需要此操作,并且这也是良好的API设计。

有关转换的详细信息,请参见FFI语义页面的Lua对象到C类型的转换部分


我正在编写同样的东西 :) 如果您知道它不会修改字符串,那么您可能甚至不需要重写C函数,只需在Lua代码(ffi.cdef)中的模板中添加const即可。 - catwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接