您的位置:首页 > 编程语言 > Lua

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

经过测试 通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: