Lua调用C函数
2014-10-30 16:27
423 查看
一.Lua调用C++全局函数
1.声明全局函数
int C_Average(lua_State *L);
2.实现全局函数
int C_Average(lua_State *L)
{
int n = lua_gettop(L);
/* 返回栈顶元素的索引。因为索引是从1开始编号的(1表示栈底,-1表示栈顶),所以这个结果等于堆栈上的元素个数(返回0表示堆栈为空)。这里栈中元素的个数就是传入的参数个数 */
double sum = 0;
double avg = 0;
for (int i = 1; i <= n; ++i)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "Incorrect argument to 'Average'");
// 将错误信息压入栈中
lua_error(L);
// 抛出栈顶的错误
/*
int lua_error (lua_State *L);
产生一个 Lua 错误。错误信息(实际上可以是任何类型的 Lua 值)必须被置入栈顶。这个函数会做一次长跳转,它不会再返回。
*/
}
sum += lua_tonumber(L, i);
// lua_tonumber 将栈中指定index的值转换成数值类型的值,注意并不会从栈中弹出这个值
}
if (n > 0)
{
avg = sum / n;
}
lua_pushnumber(L, avg); // 将avg压入栈中,第1个返回值是avg
lua_pushnumber(L, sum); // 将sum压入栈中,第2个返回值是sum
return 2;
/* return the number of results,该函数有2个返回值,即上面入栈的avg和sum */
}
3.注册全局函数
const luaL_Reg g_Func[] =
{
{"Average",
C_Average},
{NULL,
NULL}
}
for (int i = 0; g_Func[i].name != NULL; ++i)
{
lua_register(L, g_Func[i].name, g_Func[i].func);
//lua_pushcfunction(L, g_Func[i].func);
//lua_setglobal(L, g_Func[i].name);
}
4.调用示例
Lua中调用:
avg, sum = Average(10, 20, 30, 40, 50);
print("The average is ", avg)
print("The sum is ", sum)
二.Lua调用C++类成员函数
1.声明类名
const char *CST_LUA_xxClass = "fs.xx";
2.声明函数
int xx_SomeFunction(lua_State *L);
3.实现函数
int xx_SomeFunction(lua_State *L)
{
CxxClass **pObj = (CxxClass**)luaL_checkudata(L, 1, CST_LUA_xxClass);
int nParam1 = lua_tointeger(L, 2);
int nParam2 = lua_tointeger(L, 3);
BOOL bParam3 = lua_toboolean(L, 4);
lua_pushinteger(L, (*pObj)->SomeFunction(nParam1, nParam2, bParam3));
return 1;
}
4.注册函数
const luaL_Reg g_xxClassFunc[] =
{
{"SomeFunction",
xx_SomeFunction},
{NULL,
NULL}
}
调用:RegisterLuaClass(L, CST_LUA_xxClass, g_xxClassFunc);
void RegisterLuaClass(lua_State *L, const char *szClassname, const luaL_Reg *pMember)
{
// 1. 创建userdata的元表
luaL_newmetatable(L, szClassname);
// 2. 将原表的__index 设置为自己
lua_pushvalue(L, -1); // 复制元表
lua_setfield(L, -2, "__index");
// 3.将类成员函数注册到元表中去
luaL_register(L, NULL, pMember);
}
5.调用示例
PushLuaClass(L, CST_LUA_xxClass, &obj, sizeof(CxxClass));
void PushLuaClass(lua_State *L, const char *szClassname, void *pClassData, int nClassSize)
{
// 创建并拷贝数据
void *pUserdata = lua_newuserdata(L, nClassSize);
memcpy(pUserdata, pClassData, nClassSize);
// 绑定元表
luaL_getmetatable(L, szClassname);
lua_setmetatable(L, -2);
}
Lua中调用:
local val = xxobj:SomeFunction(nParam1, nParam2, bParam3);
1.声明全局函数
int C_Average(lua_State *L);
2.实现全局函数
int C_Average(lua_State *L)
{
int n = lua_gettop(L);
/* 返回栈顶元素的索引。因为索引是从1开始编号的(1表示栈底,-1表示栈顶),所以这个结果等于堆栈上的元素个数(返回0表示堆栈为空)。这里栈中元素的个数就是传入的参数个数 */
double sum = 0;
double avg = 0;
for (int i = 1; i <= n; ++i)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "Incorrect argument to 'Average'");
// 将错误信息压入栈中
lua_error(L);
// 抛出栈顶的错误
/*
int lua_error (lua_State *L);
产生一个 Lua 错误。错误信息(实际上可以是任何类型的 Lua 值)必须被置入栈顶。这个函数会做一次长跳转,它不会再返回。
*/
}
sum += lua_tonumber(L, i);
// lua_tonumber 将栈中指定index的值转换成数值类型的值,注意并不会从栈中弹出这个值
}
if (n > 0)
{
avg = sum / n;
}
lua_pushnumber(L, avg); // 将avg压入栈中,第1个返回值是avg
lua_pushnumber(L, sum); // 将sum压入栈中,第2个返回值是sum
return 2;
/* return the number of results,该函数有2个返回值,即上面入栈的avg和sum */
}
3.注册全局函数
const luaL_Reg g_Func[] =
{
{"Average",
C_Average},
{NULL,
NULL}
}
for (int i = 0; g_Func[i].name != NULL; ++i)
{
lua_register(L, g_Func[i].name, g_Func[i].func);
//lua_pushcfunction(L, g_Func[i].func);
//lua_setglobal(L, g_Func[i].name);
}
4.调用示例
Lua中调用:
avg, sum = Average(10, 20, 30, 40, 50);
print("The average is ", avg)
print("The sum is ", sum)
二.Lua调用C++类成员函数
1.声明类名
const char *CST_LUA_xxClass = "fs.xx";
2.声明函数
int xx_SomeFunction(lua_State *L);
3.实现函数
int xx_SomeFunction(lua_State *L)
{
CxxClass **pObj = (CxxClass**)luaL_checkudata(L, 1, CST_LUA_xxClass);
int nParam1 = lua_tointeger(L, 2);
int nParam2 = lua_tointeger(L, 3);
BOOL bParam3 = lua_toboolean(L, 4);
lua_pushinteger(L, (*pObj)->SomeFunction(nParam1, nParam2, bParam3));
return 1;
}
4.注册函数
const luaL_Reg g_xxClassFunc[] =
{
{"SomeFunction",
xx_SomeFunction},
{NULL,
NULL}
}
调用:RegisterLuaClass(L, CST_LUA_xxClass, g_xxClassFunc);
void RegisterLuaClass(lua_State *L, const char *szClassname, const luaL_Reg *pMember)
{
// 1. 创建userdata的元表
luaL_newmetatable(L, szClassname);
// 2. 将原表的__index 设置为自己
lua_pushvalue(L, -1); // 复制元表
lua_setfield(L, -2, "__index");
// 3.将类成员函数注册到元表中去
luaL_register(L, NULL, pMember);
}
5.调用示例
PushLuaClass(L, CST_LUA_xxClass, &obj, sizeof(CxxClass));
void PushLuaClass(lua_State *L, const char *szClassname, void *pClassData, int nClassSize)
{
// 创建并拷贝数据
void *pUserdata = lua_newuserdata(L, nClassSize);
memcpy(pUserdata, pClassData, nClassSize);
// 绑定元表
luaL_getmetatable(L, szClassname);
lua_setmetatable(L, -2);
}
Lua中调用:
local val = xxobj:SomeFunction(nParam1, nParam2, bParam3);