LuaJit FFI如何将C函数返回的字符串传递给Lua?

4

假设我有这个C语言函数:

__declspec(dllexport) const char* GetStr()
{
    static char buff[32]

    // Fill the buffer with some string here

    return buff;
}

还有这个简单的Lua模块:

local mymodule = {}

local ffi = require("ffi")

ffi.cdef[[
    const char* GetStr();
]]

function mymodule.get_str()
    return ffi.C.GetStr()
end

return mymodule

我该如何将从C函数返回的字符串作为Lua字符串获取:

local mymodule = require "mymodule"

print(mymodule.get_str())

你现在得到了什么?那段代码做了什么你不想要的事情? - Etan Reisner
目前在打印时,我得到的是 cdata<const char *>: 0x00000001,而不是字符串。根据文档,我应该使用 ffi.string(buff [,len]) 来获取实际字符串。但是当我这样做时,应用程序会崩溃。 - SLC
1
请展示您尝试的ffi.string调用以及崩溃时的回溯等信息。最好也提供填充字符串的代码。 - Etan Reisner
@EtanReisner 发现这是因为我的代码中有一个简单的错误(那种复制>粘贴的错误)。对于造成的不便,我深表歉意。现在使用hugomg的答案,示例可以正常工作。 - SLC
1个回答

7
ffi.string函数可以完成你需要的转换。
function mymodule.get_str()
    local c_str = ffi.C.GetStr()
    return ffi.string(c_str)
end

如果你遇到了崩溃问题,请确保你的C字符串已经被空字符终止,并且在你的情况下最多只有31个字符(以避免缓冲区溢出)。


我尝试过了,但应用程序崩溃了。我以为我做错了什么 :-/ - SLC
1
也许你的字符串太长了,导致缓冲区溢出? - hugomg
2
结果发现我计算错误,返回了一个整数。感谢大家的回答,对于造成的不便我深表歉意。 - SLC
1
不需要道歉。问题总有可能对未来的某个人有用。 :) - hugomg
2
31个字符的限制是因为OP的代码将字符串存储在一个32字节的缓冲区中。你应该能够将任意长度的字符串传递给ffi.string函数。 - hugomg
显示剩余2条评论

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