上篇说到 C 程序里调用Lua 函数,此篇讲Lua 脚本里调用C 函数。
Lua要调用C 程序里的函数,这些函数必须有同样的原型:
typedef int (*LuaFunc)(lua_State *L);
结合工作上的业务来实现一个简单的Lua 调用 C 函数的例子,业务上是这样的,有一便携式设备向我们的设备发送数据,通过串口发出,经过232转换485,接入我们的设备,我们的应用程序收到数据后需要将数据发送给Lua,在脚本文件里解析数据,然后Lua 再将解析的数据返回给应用程序。
以下只是简单的实现 C 调用 Lua 函数,然后 Lua 再调用 C 函数返回数据的过程:
有脚本test.lua:
--定义了一个全局表
COM = {}
function parseData(str)
print("From c/c++ str: "..str);
COM.lua_func(12, 23, 45);
end
有c文件main.c :
#include <stdio.h>
#include <stdlib.h>
#include "lauxlib.h"
#include "lua.h"
#include "lualib.h"
/* 将要注册给Lua 的函数, 定义Lua 传回三个数值 */
int LuaFunc(lua_State *L)
{
if(lua_gettop(L) != 3)
{
printf("lua send back para is not correct.\n");
return 1;
}
int ret1 = (int)lua_tonumber(L, -3);
int ret2 = (int)lua_tonumber(L, -2);
int ret3 = (int)lua_tonumber(L, -1);
printf("Line: %d, Lua send back %d, %d, %d\n", __LINE__, ret1, ret2, ret3);
return 0;
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if(luaL_loadfile(L, "test.lua"))
{
printf("load file: hello.lua faild...\n");
lua_close(L);
return 1;
}
lua_pcall(L, 0, 0, 0); /* 前面这几步都基本固定 */
lua_getglobal(L, "COM"); /* 先找到表 */
if(lua_type(L, -1) != LUA_TTABLE)
{
printf("can not find table: COM \n");
lua_close(L);
return 1;
}
lua_pushstring(L, "lua_func"); /* 注册函数 */
lua_pushcfunction(L, LuaFunc); /* 本人理解:往表 COM 里设置了COM[key] = value, 即 COM["lua_func"] = LuaFunc */
lua_settable(L, -3);
lua_getglobal(L, "parseData");
if(lua_type(L, -1) != LUA_TFUNCTION)
{
printf("can not find function: parseData.\n");
lua_close(L);
return 1;
}
lua_pushstring(L, "C Call Lua function");
lua_pcall(L, 1, 0, 0);
lua_close(L);
return 0;
}
执行结果,如下截图:
|
请发表评论