LUA因《愤怒的小鸟》一炮走红,绝非偶然。早在N多年前,《魔兽世界》的插件就开始用LUA了。如今LUA被广泛应用到游戏开发中,特别是移动平台。
LUA的特点是纯C写成,带来了强大的跨平台性,最近项目组做了一个各种手机平台的组件,需要对组件进行测试,其中绝大多数平台都是基于C的,因此用LUA编写测试的脚本,将有一劳永逸的效果。
对C的API进行测试,首先要解决的就是LUA与C的交互,基本上是LUA调C。网上搜了一圈,没有合自己需求的,大多数是拷来拷去,但是有几个原理讲得还可以,总结一下,基本是以下几点:
1,需要一个LUA的解析器,www.lua.org下载。下一份源代码。
2,在C代码中定义一个可以被LUA调用的函数,其基本形式一定要是这样
int function_name (lua_State *L)
{
...
return 1;
}
3,在LUA状态机(LUA运行环境)中注册这个函数,可以用lua_register或者 lua_pushfunction和lua_setglobal()。
lua_register(L, n, f)
lua_pushcfunction(L, f) 和 lua_setglobal(L, n)
L可以理解成LUA的运行环境,n是在lua脚本中调用时的名字,f是c语言中定义的函数名称
通过以上三步,写一个LUA脚本,就可以调用定义在C中的函数了。
具体步骤如下:
1,建一个C工程,我是用VS2010建了一个CPP的空项目。
2,下载Lua的源代码,把src文件夹下的文件除了luac.c这个文件不要,其他的.h和.c文件都加入到项目中
3,直接点生成就可以生成一个Lua解析器了。
4,因为有源代码,可以把需要被Lua调用C函数注册到Lua的状态机中,这样Lua脚本就可以调了。具体如下:
4.1,写一个可以被Lua调用的C函数原形,注意一定要符合上面说的形式。
int Testmethod_LUA(lua_State* L)
{
lua_pushnumber(L, 10);//lua传参采用栈的形式,这里可以理解成Testmethod_LUA这个函数返回10
return 1;
}
4.2,把这个函数注册到LUA的运行环境中。在lua.c这个文件的main函数中,
lua_State *L = lua_open();
上面这句之后加上注册的函数
luaL_openlibs(L);//加载Lua基本库
lua_register(L, "callcfunc", Testmethod_LUA);//callcfunc这个是lua脚本中调的时候的函数名
5,再编译一下这个工程,里面就有一个名叫C名称叫Testmethod_LUA,lua脚本名称叫callcfunc的函数了。
6,编写Lua脚本调用这个函数
local c = callcfunc();
print(c);
7,输出结果为:
参考:http://blog.youkuaiyun.com/sumoyu/article/details/2592693