Lua C接口調(diào)用示例

? ? ? lua是一門語法簡單饺窿,效率很高的腳本語言歧焦,能夠很方便的與C語言交互,很適合做膠水語言使用肚医,本文內(nèi)容有兩部分绢馍,第一部分講如何在C語言中調(diào)用lua,第二部分講如何在lua中調(diào)用C語言模塊肠套。

1.在C語言中調(diào)用lua

? ? ?在C語言中調(diào)用lua要用到lua提供的C語言接口舰涌,test.c示例代碼如下,linux下編譯指令:

? ? ? gcc ?test.c ?-o ?test ? ?/usr/local/lib/liblua.a ? -lm ? -ldl

? ? 然后輸入 ./test 即可運行生成的可運行文件 test


#include <stdio.h>

#include <string.h>

#include <lua.h>

#include <lauxlib.h>

#include <lualib.h>

//待Lua調(diào)用的C注冊函數(shù)你稚。

static int add2(lua_State* L)

{

? ? //檢查棧中的參數(shù)是否合法瓷耙,1表示Lua調(diào)用時的第一個參數(shù)(從左到右),依此類推刁赖。

? ? //如果Lua代碼在調(diào)用時傳遞的參數(shù)不為number搁痛,該函數(shù)將報錯并終止程序的執(zhí)行。

? ? double op1 = luaL_checknumber(L,1);

? ? double op2 = luaL_checknumber(L,2);

? ? //將函數(shù)的結(jié)果壓入棧中宇弛。如果有多個返回值鸡典,可以在這里多次壓入棧中。

? ? lua_pushnumber(L,op1 + op2);

? ? //返回值用于提示該C函數(shù)的返回值數(shù)量枪芒,即壓入棧中的返回值數(shù)量彻况。

? ? return 1;

}

//另一個待Lua調(diào)用的C注冊函數(shù)。

static int sub2(lua_State* L)

{

? ? double op1 = luaL_checknumber(L,1);

? ? double op2 = luaL_checknumber(L,2);

? ? lua_pushnumber(L,op1 - op2);

? ? return 1;

}

const char* testfunc = "print(add2(1.0,2.0)) print(sub2(20.1,19))";

int main()

{

? ? lua_State* L = luaL_newstate();

???? luaL_openlibs(L);

? ? //將指定的函數(shù)注冊為Lua的全局函數(shù)變量舅踪,其中第一個字符串參數(shù)為Lua代碼

? ? //在調(diào)用C函數(shù)時使用的全局函數(shù)名纽甘,第二個參數(shù)為實際C函數(shù)的指針。

? ? lua_register(L, "add2", add2);

???? lua_register(L, "sub2", sub2);

? ? //在注冊完所有的C函數(shù)之后硫朦,即可在Lua的代碼塊中使用這些已經(jīng)注冊的C函數(shù)了贷腕。

? ? if (luaL_dostring(L,testfunc))

? ? ? ? printf("Failed to invoke.\n");

? ? lua_close(L);

? ? return 0;

}





2. 在lua語言中調(diào)用C語言生成的.so文件

首先將test.c中的c代碼編譯成.so文件,編譯命令如下:

gcc ?test.c ?-fPIC -shared -o mylibs.so


test.c代碼:


#include <lua.h>

#include <lauxlib.h>

#include <lualib.h>

//待注冊的C函數(shù)咬展,該函數(shù)的聲明形式在上面的例子中已經(jīng)給出泽裳。

//需要說明的是,該函數(shù)必須以C的形式被導(dǎo)出破婆,因此extern "C"是必須的涮总。

//函數(shù)代碼和上例相同,這里不再贅述祷舀。

int add(lua_State* L)

{

? ? double op1 = luaL_checknumber(L,1);

? ? double op2 = luaL_checknumber(L,2);

? ? lua_pushnumber(L,op1 + op2);

? ? return 1;

}

int sub(lua_State* L)

{

? ? double op1 = luaL_checknumber(L,1);

? ? double op2 = luaL_checknumber(L,2);

? ? lua_pushnumber(L,op1 - op2);

? ? return 1;

}

//luaL_Reg結(jié)構(gòu)體的第一個字段為字符串瀑梗,在注冊時用于通知Lua該函數(shù)的名字烹笔。

//第一個字段為C函數(shù)指針。

//結(jié)構(gòu)體數(shù)組中的最后一個元素的兩個字段均為NULL抛丽,用于提示Lua注冊函數(shù)已經(jīng)到達數(shù)組的末尾谤职。

static luaL_Reg mylibs[] = {

? ? {"add", add},

? ? {"sub", sub},

? ? {NULL, NULL}

};

//該C庫的唯一入口函數(shù)。其函數(shù)簽名等同于上面的注冊函數(shù)亿鲜。見如下幾點說明:

//1. 我們可以將該函數(shù)簡單的理解為模塊的工廠函數(shù)允蜈。

//2. 其函數(shù)名必須為luaopen_xxx,其中xxx表示library名稱蒿柳。Lua代碼require "xxx"需要與之對應(yīng)饶套。

//3. 在luaL_register的調(diào)用中,其第一個字符串參數(shù)為模塊名"xxx"垒探,第二個參數(shù)為待注冊函數(shù)的數(shù)組妓蛮。

//4. 需要強調(diào)的是,所有需要用到"xxx"的代碼圾叼,不論C還是Lua蛤克,都必須保持一致,這是Lua的約定褐奥,

//? 否則將無法調(diào)用咖耘。

int luaopen_mylibs(lua_State* L)

{

? ? luaL_newlib(L,mylibs);

? ? return 1;

}



然后運行test.lua代碼,test.lua文件代碼如下撬码,在shell輸入命令 lua ?test.lua即可


test.lua代碼:


local test = require "mylibs" --指定包名稱

print(test.add(1.0,2.0))

print(test.sub(20.1,19))

print("hello world")


3.參考資料

http://www.voidcn.com/article/p-slqvktkf-bnz.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市版保,隨后出現(xiàn)的幾起案子呜笑,更是在濱河造成了極大的恐慌,老刑警劉巖彻犁,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叫胁,死亡現(xiàn)場離奇詭異,居然都是意外死亡汞幢,警方通過查閱死者的電腦和手機驼鹅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來森篷,“玉大人输钩,你說我怎么就攤上這事≈僦牵” “怎么了买乃?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钓辆。 經(jīng)常有香客問我剪验,道長肴焊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任功戚,我火速辦了婚禮娶眷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啸臀。我一直安慰自己茂浮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布壳咕。 她就那樣靜靜地躺著席揽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谓厘。 梳的紋絲不亂的頭發(fā)上幌羞,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音竟稳,去河邊找鬼属桦。 笑死,一個胖子當(dāng)著我的面吹牛他爸,可吹牛的內(nèi)容都是我干的聂宾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼诊笤,長吁一口氣:“原來是場噩夢啊……” “哼系谐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讨跟,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纪他,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晾匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茶袒,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年凉馆,在試婚紗的時候發(fā)現(xiàn)自己被綠了薪寓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡澜共,死狀恐怖向叉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咳胃,我是刑警寧澤植康,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站展懈,受9級特大地震影響销睁,放射性物質(zhì)發(fā)生泄漏供璧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一冻记、第九天 我趴在偏房一處隱蔽的房頂上張望睡毒。 院中可真熱鬧,春花似錦冗栗、人聲如沸演顾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钠至。三九已至,卻和暖如春胎源,著一層夾襖步出監(jiān)牢的瞬間棉钧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工涕蚤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪卿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓万栅,卻偏偏與公主長得像佑钾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烦粒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容