【问题标题】:How do I pass a Lua Table to/from a C function using cffi-lua如何使用 cffi-lua 向/从 C 函数传递 Lua 表
【发布时间】:2021-12-22 03:39:26
【问题描述】:

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

如果C函数是

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

Lua 表是

local mytable = {2,4,6,8} --as if an array of ints

我如何将它传递给/从 C 函数

【问题讨论】:

  • ffi.C.execvp 运行一个可执行文件,而我的 dummy() 是加载库中的一个过程
  • execvp 也是加载库中的一个过程;-) 您需要创建 int 的 FFI 数组并使用您的 Lua 表对其进行初始化(与为 @ 初始化 char* 数组的方式相同) 987654326@).
  • 好的,现在知道了。我确实在搜索的早些时候找到了那个帖子,但是“ls -al”让我很困惑。

标签: lua ffi luajit


【解决方案1】:

如果像我这样的其他人对上面附加帖子中的答案感到困惑,这里是一个将 Lua 表传递给 C 库的完整工作示例。 关键是要知道 Lua 中的数字是 C 中的双精度数 如果这不是最佳解决方案,我相信有人会告诉我/我们!

--Lua 代码,v5.4.3 使用 Ubuntu 21.10

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

-- Require cffi-lua, not from luaJIT
-- via LuaRocks, with LUA_CPATH set
local cffi = require("cffi")

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

-- Function prototype definitions
cffi.cdef [[
   //int gettable(const char *file, const char **datav); //Original
   int getStable(const char **data);
   int getItable(const double *data, int size);
]]

-- Main program ------------------------------------
print("Test Program!")

local data1 = cffi.new("const char*[3]", {"ls", "-lsdfsdf"}) --original, works

--from a 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)

--from a Lua Table, where it is necessary to know that Lua Numbers
-- are Doubles in 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("Bye!")

C 库代码,编译时使用 gcc foo.c -shared -fPIC -std=c11 -o libfoo.so

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

//Using Strings
int getStable(const char **data)
{
  printf("In S GetTable\n");
  for (const char **item = data; *item; ++item)
  {
    printf("Processing Item: %s\n", *item);
  }
  //not used
  return 0;
}

//Using Doubles
int getItable(const double *data, int size)
{
  printf("In I GetTable, with size: %d\n", size);
  for (int i = 0; i < size; i++)
  {
    printf("Processing Item: %lf\n", data[i]);
  }
  //not used
  return 0;
}

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2019-03-23
    • 2011-01-14
    • 2010-10-02
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多