Lua与C相互调用
原创
©著作权归作者所有:来自51CTO博客作者tcspecial的原创作品,请联系作者获取转载授权,否则将追究法律责任
Lua 提供了强大的API用于与C间的交互,两者值间的传递通过虚拟堆栈来实现。
一. 实现Lua解释器
/**
* Lua 解释器
*/
int main( int argc, char **argv )
{
// 初始化解释器
lua_State *pl = luaL_newstate();
// 加载基础库,包括io,os,math等
luaL_openlibs( pl );
// 执行lua脚本
luaL_dofile( pl, "./hello.lua" );
lua_close( pl );
return 0;
}
上述少许代码实现了lua解释器,运行打印hello world。
二. C调用Lua函数
2.1 Lua函数实现
-- add
function add( x, y )
return x + y
end
2.2 调用Lua函数
/**
* lua通过虚拟堆栈来传递值
*
*/
int luaadd( lua_State *l, int x, int y )
{
// 通过lua中的add()
lua_getglobal( l, "add" );
// 参数x入栈
lua_pushnumber( l, x );
// 通统y入栈
lua_pushnumber( l, y );
// 调用,nargs=2,nresults=1
lua_call( l, 2, 1 );
// 强转(栈顶元素)
int sum = (int)lua_tointeger( l, -1 );
// 堆栈平衡
lua_setglobal( l, "add );
return sum;
}
/**
* C调用lua测试
*
*/
int Calllua_test()
{
// init
lua_State *l = luaL_newstate();
luaL_openlibs( l );
// 执行lua脚本
luaL_dofile( l, "./add.lua" );
// 调用lua的add()
int sum = luaadd( l, 10, 15 );
printf( "Lua add: %d\n", sum );
lua_close( l );
return 0;
}
执行结果:
Lua add: 25
三. Lua调用C
3.1 Lua调用代码
-- average
function main()
local avg, sum = average( 2, 2, 3, 5 )
print( "avg: ", avg )
print( "sum: ", sum )
end
main()
3.2 C平均值实现
/**
* 求取平均数
*/
static int average( lua_State *l )
{
// 获取参数个数
int n = lua_gettop( l );
double sum = 0;
int i = 0;
for( i=1; i<=n; i++ )
{
sum += lua_tonumber( l, i );
}
// 压入平均值
lua_pushnumber( l, sum/n );
// 压入和
lua_pushnumber( l, sum );
// 返回值个数
return 2;
}
/**
* Lua调用C测试
*
*/
int Callc_test()
{
// init
lua_State *l = luaL_newstate();
luaL_openlibs( l );
// register
lua_register( l, "average", average );
// do
luaL_dofile( l, "./avg.lua" );
lua_close( l );
return 0;
}
执行结果:
avg: 3.0
sum: 12.0
参数链接:
http://www.lua.org/manual/5.3/manual.html
http://www.jb51.net/article/72661.htm