c++作为底层框架和lua进行打通
2014-03-13 22:58
344 查看
现在比较流行c++作为底层,而lua作为逻辑。
为了打通c++和lua,实现了这样一个类:
LuaContext::LuaContext()
{
m_isLocalContext_= true;
m_lua_ = luaL_newstate();
}
LuaContext::LuaContext(lua_State *state)
{
m_isLocalContext_= false;
m_lua_ = state;
}
LuaContext::~LuaContext()
{
if (m_isLocalContext_)
{
lua_close(m_lua_);
}
}
void LuaContext::loadBase()
{
lua_pushcfunction(m_lua_, luaopen_base);
lua_pushstring(m_lua_, "");
lua_call(m_lua_, 1, 0);
}
void LuaContext::loadLibs()
{
luaL_openlibs(m_lua_);
}
void LuaContext::loadPackage()
{
lua_pushcfunction(m_lua_, luaopen_package);
lua_pushstring(m_lua_, LUA_LOADLIBNAME);
lua_call(m_lua_, 1, 0);
}
void LuaContext::loadTable()
{
lua_pushcfunction(m_lua_, luaopen_table);
lua_pushstring(m_lua_, LUA_TABLIBNAME);
lua_call(m_lua_, 1, 0);
}
void LuaContext::loadOs()
{
lua_pushcfunction(m_lua_, luaopen_os);
lua_pushstring(m_lua_, LUA_OSLIBNAME);
lua_call(m_lua_, 1, 0);
}
void LuaContext::appendLibPath(const std::string &path)
{
lua_getglobal(m_lua_, "package");
lua_getfield(m_lua_, -1, "path");
lua_pushstring(m_lua_, ";");
lua_pushstring(m_lua_, path.c_str());
lua_concat(m_lua_, 3);
lua_setfield(m_lua_, -2, "path");
lua_pop(m_lua_, 1);
}
bool LuaContext::load(const char *lua_file)
{
if(luaL_dofile(m_lua_, lua_file) != 0)
{
LOG_ERROR( "Error open file " << lua_file << ", Error: " << lua_tostring(m_lua_, -1));
lua_pop(m_lua_, 1);
return false;
}
return true;
}
void LuaContext::getGlobal(const char* symbol)
{
lua_getglobal(m_lua_, symbol);
}
int LuaContext::getGlobalInt(const char* key)
{
getGlobal(key);
int value = lua_tointeger(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
string LuaContext::getGlobalString(const char* key)
{
getGlobal(key);
string value = lua_tostring(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
int LuaContext::getFieldInt(const char *key)
{
lua_getfield(m_lua_, -1, key);
int value = lua_tointeger(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
string LuaContext::getFieldString(const char *key)
{
lua_getfield(m_lua_, -1, key);
string value = lua_tostring(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
string LuaContext::getIFieldString(int i)
{
lua_rawgeti(m_lua_, -1, i);
string value = lua_tostring(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
int LuaContext::getIFieldInt(int i)
{
lua_rawgeti(m_lua_, -1, i);
int value = lua_tointeger(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
lua_State* LuaContext::getLuaState(void)
{
return m_lua_;
}
int LuaContext::gc(int what, int data)
{
return lua_gc (m_lua_, what, data);
}
这里我们使用luajit, luajit的安装和使用参考:
http://luajit.org/install.html
这里我们使用的是静态链接编译:
SLIB += $(LUAJIT_ROOT)/lib/libluajit-5.1.a
经过测试 通过。
为了打通c++和lua,实现了这样一个类:
LuaContext::LuaContext()
{
m_isLocalContext_= true;
m_lua_ = luaL_newstate();
}
LuaContext::LuaContext(lua_State *state)
{
m_isLocalContext_= false;
m_lua_ = state;
}
LuaContext::~LuaContext()
{
if (m_isLocalContext_)
{
lua_close(m_lua_);
}
}
void LuaContext::loadBase()
{
lua_pushcfunction(m_lua_, luaopen_base);
lua_pushstring(m_lua_, "");
lua_call(m_lua_, 1, 0);
}
void LuaContext::loadLibs()
{
luaL_openlibs(m_lua_);
}
void LuaContext::loadPackage()
{
lua_pushcfunction(m_lua_, luaopen_package);
lua_pushstring(m_lua_, LUA_LOADLIBNAME);
lua_call(m_lua_, 1, 0);
}
void LuaContext::loadTable()
{
lua_pushcfunction(m_lua_, luaopen_table);
lua_pushstring(m_lua_, LUA_TABLIBNAME);
lua_call(m_lua_, 1, 0);
}
void LuaContext::loadOs()
{
lua_pushcfunction(m_lua_, luaopen_os);
lua_pushstring(m_lua_, LUA_OSLIBNAME);
lua_call(m_lua_, 1, 0);
}
void LuaContext::appendLibPath(const std::string &path)
{
lua_getglobal(m_lua_, "package");
lua_getfield(m_lua_, -1, "path");
lua_pushstring(m_lua_, ";");
lua_pushstring(m_lua_, path.c_str());
lua_concat(m_lua_, 3);
lua_setfield(m_lua_, -2, "path");
lua_pop(m_lua_, 1);
}
bool LuaContext::load(const char *lua_file)
{
if(luaL_dofile(m_lua_, lua_file) != 0)
{
LOG_ERROR( "Error open file " << lua_file << ", Error: " << lua_tostring(m_lua_, -1));
lua_pop(m_lua_, 1);
return false;
}
return true;
}
void LuaContext::getGlobal(const char* symbol)
{
lua_getglobal(m_lua_, symbol);
}
int LuaContext::getGlobalInt(const char* key)
{
getGlobal(key);
int value = lua_tointeger(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
string LuaContext::getGlobalString(const char* key)
{
getGlobal(key);
string value = lua_tostring(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
int LuaContext::getFieldInt(const char *key)
{
lua_getfield(m_lua_, -1, key);
int value = lua_tointeger(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
string LuaContext::getFieldString(const char *key)
{
lua_getfield(m_lua_, -1, key);
string value = lua_tostring(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
string LuaContext::getIFieldString(int i)
{
lua_rawgeti(m_lua_, -1, i);
string value = lua_tostring(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
int LuaContext::getIFieldInt(int i)
{
lua_rawgeti(m_lua_, -1, i);
int value = lua_tointeger(m_lua_, -1);
lua_pop(m_lua_, 1);
return value;
}
lua_State* LuaContext::getLuaState(void)
{
return m_lua_;
}
int LuaContext::gc(int what, int data)
{
return lua_gc (m_lua_, what, data);
}
这里我们使用luajit, luajit的安装和使用参考:
http://luajit.org/install.html
这里我们使用的是静态链接编译:
SLIB += $(LUAJIT_ROOT)/lib/libluajit-5.1.a
经过测试 通过。
相关文章推荐
- c++将数组名作为函数参数对数组元素进行相应的运算
- lua与C++粘合层框架
- 在C++中类的对象作为函数形参在底层的实现机制
- C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API
- 又一个lua与C++粘合层框架
- C\C++和Lua是如何进行通信的?
- 又一个lua与C++粘合层框架
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (转)
- C/C++ 中使用lua作为配置文件
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- c++ lua服务器框架
- C++指针作为函数的参数进行传递时需要注意的一些问题
- lua 对C++对象进行转换
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- c++ lua 服务器框架
- C++对Lua中table进行读取、修改和创建
- lua 对C++对象进行转换
- [lua] 使用lua string作为二进制buffer和c/c++交互
- C++对Lua中table进行读取、修改和创建
- [lua] 使用lua string作为二进制buffer和c/c++交互