2016-03-17 66 views
2

我有C代碼看起來像下面這樣:如何用Lua中的函數指針和SWIG綁定調用函數?

typedef int (*SIMPLEFUNC)(int); 

SIMPLEFUNC foo = NULL; 

void setup_foo(void) { 
    foo = ...; 
} 

我痛飲了裸機.i文件把這個包,然後可以在Lua使用它。我可以給Lua打電話setup_foo()。我可以看到變量foo。但是我無法從Lua中調用foo作爲函數。它顯示爲userdata。

local mylib = require('mylib') 
mylib.setup_foo() 
print(mylib.foo) 
print(mylib.foo(3)) 

我得到這樣的輸出:

setup_foo() has been called 
userdata: 0x1b441c8 
PANIC: [string "bootstrap0"]:86: attempt to call a userdata value (field 'foo') 
stack traceback: 
    [string "bootstrap0"]:86: in main chunk 

問題

有沒有一種方法使用痛飲時要調用的函數指針如foo從我的Lua代碼?

有一些SWIG配置可能有幫助嗎?

如果不是,那麼修改我的C代碼以使其工作的最佳方法是什麼?

編輯

在一個較高的水平,我通過切換到塞勒涅,而不是痛飲解決了這個問題。 Selene允許在運行時輕鬆地在Lua狀態下重新綁定函數。 https://github.com/jeremyong/Selene

回答

2

來處理這個最簡單的方法是簡單地揭露調用該函數指針的函數:

SIMPLEFUNC foo = NULL; 

int call_foo(int i) {return foo(i);} 

這當然是在你的.i文件。你不想直接暴露給C;它只是Lua的一個幫助函數。

SWIG可能有更直接的處理方法。也許是一些typemap構造或somesuch。但這是最簡單的方法。此外,它不像SWIG允許你將Lua函數推入該函數指針。