Lua与C交互之函数注册

概述

前面讲了C与Lua交互的原理,其中讲到了Lua调用C的接口时,需要C将函数通过注册机制注册到当前lua_State全局变量中,接下来通过一个实例具体介绍怎么注册并调用到C的函数接口。

1 实现实际操作的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;
}

2 实现Lua与C的数据转换函数

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;
}

3 实现注册到Lua中的函数库函数

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;
}

4 实现注册到Lua的函数库与Lua全局变量对应

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);   
}

5 Lua中使用测试

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接口的使用步骤了!

你可能感兴趣的:(Lua,Lua学习)