如何使用cffi-lua将Lua表格传递给/从C函数中传递

我正在使用Lua 5.4.3,而不是LuaJIT/FFI,在Ubuntu 21.10上使用cffi-lua

如果C函数是

ffi.cdef [[
   void dummy(int* ptr_form_lua, int size)
]]

而Lua表格是

local mytable = {2,4,6,8} -- 就像一个int数组

如何将其传递给/从C函数

原文链接 https://stackoverflow.com/questions/69898031

点赞
stackoverflow用户421213
stackoverflow用户421213

如果像我一样有人对上面附带的帖子中的答案感到困惑,这里是一个将 Lua Table 传递给 C 库的完整工作示例。 关键是要知道 Lua 中的数字在 C 中是双精度浮点数。

我相信如果这不是最佳解决方案,有人会告诉我 / 我们!

--Lua 代码,使用 Ubuntu 21.10

#!/usr/bin/env -S lua -W

-- 引入 cffi-lua,不从 LuaJIT 引入
-- 通过 LuaRocks,并设置好 LUA_CPATH
local cffi = require("cffi")

-- 加载 libfoo
local mylib = cffi.load('./libfoo.so')

-- 函数原型定义
cffi.cdef [[
   //int gettable(const char *file, const char **datav); //原始
   int getStable(const char **data);
   int getItable(const double *data, int size);
]]

-- 主程序 ------------------------------------
print("测试程序!")

local data1 = cffi.new("const char*[3]", {"ls", "-lsdfsdf"}) -- 原始,可行

-- 从 Lua Table 中读取
local mytableS = {"string one", "string two", "string three"}
local mytableSlen = #mytableS
local mytableSCstruct = "const char*[" .. mytableSlen + 1 .. "]"
local mytableSCuserdata = cffi.new(mytableSCstruct, mytableS)
print(type(mytableSCuserdata))
local ret = mylib.getStable(mytableSCuserdata)
print(ret)

-- 从 Lua Table 中读取,需要知道 Lua 中的数字在 C 中是双精度浮点数
local mytableI = {12,23,34,45,56,67,78,89,91,120, 3.142, 2.71828}
local mytableIlen = #mytableI
local mytableICstruct = "const double[" .. mytableIlen .. "]"
local mytableICuserdata = cffi.new(mytableICstruct, mytableI)
print(type(mytableICuserdata))
local ret = mylib.getItable(mytableICuserdata, mytableIlen)
print(ret)

print("再见!")

使用以下编译的 C 库代码: gcc foo.c -shared -fPIC -std=c11 -o libfoo.so

/***************************************
  library
***************************************/
#include <stdio.h>
#include <stdlib.h>

//使用字符串
int getStable(const char **data)
{
  printf("在 S GetTable 中\n");
  for (const char **item = data; *item; ++item)
  {
    printf("处理项:%s\n", *item);
  }
  // 未使用
  return 0;
}

//使用双精度浮点数
int getItable(const double *data, int size)
{
  printf("在 I GetTable 中,大小为:%d\n", size);
  for (int i = 0; i < size; i++)
  {
    printf("处理项:%lf\n", data[i]);
  }
  // 未使用
  return 0;
}
2021-11-10 11:44:14