Lua与C相互调用

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

相关推荐