私はlua_Stateを作成してカスタムのluaコードを作成するC++プログラムを作成しました。カスタムLuaの関数を呼び出す前に、luaopen_ffi()はlua_Stateと呼ばれている:私のプログラムは、カスタムLuaのコードを実行するときluaopen_ffiを呼び出した後にffi名前空間が見つかりません
luaopen_ffi(lua_state_);
しかし、それはFFIを見つけることができません。私はさらにFFIの値をプリントアウトし、悲しいことではなくnil
です:
print(ffi) --- which outputs nil
例えば非nilの値を持っているんluaopenを使用してロードされた他のライブラリは、
print(io) --- outputs table: 0x400af268
私はさらにソースを確認しながら、私もffi = require("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;
}
:luaopen_ffiのコードが、それはそのコメントに基づいてグローバルFFIの名前空間を作成していないと言います動作しません :(。
luaopen_ffiを呼び出した後、どのようにffi機能を使用することができますか?またはluaopen_ffiは正しい方法ではありませんか?
あなたはLuaJITメーリングリストに尋ねるほうがよいかもしれません。 – refi64
最初に 'luaopen_ffi'を手動で呼び出すかどうか' ffi = require( "ffi") 'を試しましたか?私はそれが後に動作しないかもしれないが、それがなければならないと思います。 –
>最初に手動でluaopen_ffiを呼び出してもしなくても、ffi = require( "ffi")を試しましたか? --- 私はC++から呼び出そうとしたときにうまくいきませんでしたが、LuaJITを直接使用しようとしたときに動作します。 – keelar