调用 luaopen_ffi 后找不到 ffi 命名空间

我有一个 C++ 程序,它会创建一个 lua_State 并调用自定义的 lua 代码。在调用自定义 lua 函数之前,会使用 luaopen_ffi() 函数和 lua_State 一起调用:

luaopen_ffi(lua_state_);

然而,当我的程序执行自定义 lua 代码时,它无法找到 ffi。我进一步打印了 ffi 的值,不幸的是它是 nil:

print(ffi)  --- 输出 nil

而其他使用 luaopen 加载的库都具有非 nil 值,例如

print(io)  --- 输出 table: 0x400af268

我进一步检查了 luaopen_ffi 的源代码,它根据注释说明它不会创建基于全局 ffi 命名空间:

LUALIB_API int luaopen_ffi(lua_State *L) {
  CTState *cts = lj_ctype_init(L);
  settabV(L, L->top++, (cts->miscmap = lj_tab_new(L, 0, 1)));
  cts->finalizer = ffi_finalizer(L);
  LJ_LIB_REG(L, NULL, ffi_meta);
  /* NOBARRIER: basemt is a GC root. */
  setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top-1)));
  LJ_LIB_REG(L, NULL, ffi_clib);
  LJ_LIB_REG(L, NULL, ffi_callback);
  /* NOBARRIER: the key is new and lj_tab_newkey() handles the barrier. */
  settabV(L, lj_tab_setstr(L, cts->miscmap, &cts->g->strempty), tabV(L->top-1));
  L->top--;
  lj_clib_default(L, tabV(L->top-1));  /* Create ffi.C default namespace. */
  lua_pushliteral(L, LJ_OS_NAME);
  lua_pushliteral(L, LJ_ARCH_NAME);
  LJ_LIB_REG(L, NULL, ffi);  /* Note: no global "ffi" created! */
  ffi_register_module(L);
  return 1;
}

我还尝试了 ffi = require("ffi"),但无效 :(。

那么在调用 luaopen_ffi 后如何使用 ffi 功能呢?或者 luaopen_ffi 不是正确的方法吗?

点赞
用户107090
用户107090

如果您想要一个名为 ffi 的全局变量,可以尝试以下操作:

luaopen_ffi(lua_state_);
lua_setglobal(lua_state_ ,"ffi");

似乎 luaopen_ffi 会在堆栈中保留表格,这在 Lua 模块中很常见。

2016-04-14 02:24:54