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

问题描述:

我有一个在Lua中定义的表/对象。我试图从C-API dll中添加一些方法。我可以一次只附加一个方法,但其中有很多。下面代码的最后一行是我想如何做到的。它应该将这些方法合并到Utilities对象中,以便我不必一次一个地完成它们。我收到以下错误:如何使用LuaJIT和FFI将clib函数合并到表中?

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

下面是一些示例代码:

Utilities = {} 

-- 
-- Other Code that defines/attaches methods to Utilities 
-- 

-- Define some methods from my utilities.dll 
local ffi = require("ffi") 
ffi.cdef[[ 
void LogThis(const char * format, ...); 
]] 

local utilities_ffi = ffi.load("utilities") 

-- This works 
utilities_ffi.LogThis("hello world") 

-- merge the two tables together (this fails) 
for k,v in pairs(utilities_ffi) do Utilities[k] = v end 

FFI必须返回用户数据对象。

FFI库对象不支持迭代;你不能在其上运行pairs。您必须手动为每个功能编写分配。

另外请记住,直接从库对象访问C函数的速度会更快,而不是将它们存储在表(甚至是本地变量)中并在那里访问它们。请参阅the FFI tutorial的最后一部分。

试试这个:

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 --cache it 
    end}) 
end 

Utilities = merge(utilities_ffi, other_ffi)