前面讲了C与Lua交互的原理,其中讲到了Lua调用C的接口时,需要C将函数通过注册机制注册到当前lua_State的全局变量中,接下来通过一个实例具体介绍怎么注册并调用到C的函数接口。
static int add(int a, int b)
{
return a+b;
}
static int sub(int a, int b)
{
return a - b;
}
static int mul(int a, int b)
{
return a * b;
}
static int lua_add_api(lua_State *L)
{
//至少要有两个参数
if ((!lua_isinteger(L, 1)) || (!lua_isinteger(L, 2)))
return 0;
int a = lua_tointeger(L, 1);
int b = lua_tointeger(L, 2);
int ret = add(a, b);
lua_pushnumber(L, ret);
return 1;
}
static int lua_sub_api(lua_State *L)
{
//至少要有两个参数
if ((!lua_isinteger(L, 1)) || (!lua_isinteger(L, 2)))
return 0;
int a = lua_tointeger(L, 1);
int b = lua_tointeger(L, 2);
int ret = sub(a, b);
lua_pushnumber(L, ret);
return 1;
}
static int lua_mul_api(lua_State *L)
{
//至少要有两个参数
if ((!lua_isinteger(L, 1)) || (!lua_isinteger(L, 2)))
return 0;
int a = lua_tointeger(L, 1);
int b = lua_tointeger(L, 2);
int ret = mul(a, b);
lua_pushnumber(L, ret);
return 1;
}
static int luaope_api(lua_State* L)
{
static luaL_Reg ope_lib[] = {
{ "add", lua_add_api},
{ "sub", lua_sub_api},
{ "mul", lua_mul_api},
{NULL, NULL}
};
// 创建导出库函数
luaL_newlib(L, ope_lib);
return 1;
}
void pre_loadlibs(lua_State* L)
{
// 预加载扩展静态库
luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
lua_pushcfunction(L, luaope_api);
lua_setfield(L, -2, "ope_api");
lua_pop(L, 1);
}
local test = function()
local a, b = 20, 5;
local ope_api = require("ope_api");
local ret_add = ope_api.add(a, b);
local ret_sub = ope_api.sub(a, b);
local ret_mul = ope_api.mul(a, b);
print("the function ret_add:",ret_add);
print("the function ret_sub:",ret_sub);
print("the function ret_mul:",ret_mul);
end
测试结果:
[LUA-print]: the function ret_add: 25.0
[LUA-print]: the function ret_sub: 15.0
[LUA-print]: the function ret_mul: 100.0
以上介绍就是Lua调用C接口的使用步骤了!