如何使用LuaJIT和FFI将clib函数合并到表中?

我在 Lua 中定义了一个表/对象。我正在尝试从 C-API dll 中添加一些方法。我可以一个接一个地附加方法,但是它们有很多。下面代码的最后一行是我想要的方法。它应该将这些方法合并到“Utilities”对象中,以便我不必一个接一个地添加它们。但我得到以下错误:

bad argument #1 to 'pairs' (table expected, got userdata)"  const char *

这是一些示例代码:

Utilities = {}

--
-- 其他定义/附加到Utilities的代码
--

-- 定义从utilities.dll中的一些方法
local ffi = require("ffi")
ffi.cdef[[
void LogThis(const char * format, ...);
]]

local utilities_ffi = ffi.load("utilities")

-- 这个是有效的
utilities_ffi.LogThis("hello world")

-- 合并两个表(这将失败)
for k,v in pairs(utilities_ffi) do Utilities[k] = v end

FFI 应该会返回一个userdata对象。

点赞
用户646619
用户646619

FFI库对象不支持迭代; 无法对它们运行 pairs。 您将不得不为每个函数手动编写赋值。

还要注意,直接从库对象中访问C函数比将它们存储在表格(甚至是局部变量)中并在那里访问它们要快。 参见 FFI教程 的最后一节。

2014-11-01 13:52:25
用户88888888
用户88888888

试试这个:

local function get(C, k)
  return C[k]
end
function merge(C1, C2)
   return setmetatable({}, {__index = function(t, k)
      local ok, ret = pcall(get, C, k)
      local v = ok and ret or C2[k]
      t[k] = v --缓存它
   end})
end

Utilities = merge(utilities_ffi, other_ffi)
2015-07-30 18:58:00