2016-04-14 6 views
1

私は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は正しい方法ではありませんか?

+0

あなたはLuaJITメーリングリストに尋ねるほうがよいかもしれません。 – refi64

+0

最初に 'luaopen_ffi'を手動で呼び出すかどうか' ffi = require( "ffi") 'を試しましたか?私はそれが後に動作しないかもしれないが、それがなければならないと思います。 –

+0

>最初に手動でluaopen_ffiを呼び出してもしなくても、ffi = require( "ffi")を試しましたか? --- 私はC++から呼び出そうとしたときにうまくいきませんでしたが、LuaJITを直接使用しようとしたときに動作します。 – keelar

答えて

2

あなたはffiという名前のグローバルをしたい場合は、これを試してみてください。

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

Luaのモジュールに通常のようluaopen_ffiは、スタック上のテーブルを残しているようです。

+0

これは "ffi"を利用可能にします。しかし、私はffi.cdefのような通常のffi構文を使用できないこと、またはffi.Cで定義された関数を使用することができないことを発見しました。さらに、ffi.Cまたはffi.cdefを出力すると、両方ともnilと表示されます。私が間違っていることを知ることができますか? – keelar

+0

私はlua_setglobalを追加しようとするとluaopen_ffiを削除することがあります。今私はluaopen_ffiとlua_setglobalの両方を持っているとき、それは魅力のように機能します。どうもありがとうございます!!! – keelar

+0

答えをありがとう! C++プログラムがluaスクリプトを実行しようとしたときに、luaスクリプトで使用したいC関数がロードされていないことがわかりました。必要なカスタムC関数/ライブラリをプリロードしてffi.cdef [[]]とffi.C名前空間の下で使用できるようにlua_Stateを作成する方法はありますか? – keelar

関連する問題