探索LUA用于API级的测试中(用C对Lua进行扩展)

来源:互联网 发布:雅马哈p电脑软件 编辑:程序博客网 时间:2024/05/16 06:46
 

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_pushfunctionlua_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.csdn.net/sumoyu/article/details/2592693

原创粉丝点击