这里讲下Lua与C++之间如何实现相互调用
DJLCData.h 实现类
//
//DJLCData.h
//uitestLua
//
//Created by 杜甲 on 14-5-17.
//
//
#ifndef __uitestLua__DJLCData__
#define __uitestLua__DJLCData__
#include cocos2d.h
#include CCLuaEngine.h
USING_NS_CC;
using namespace std;
extern C{
#include lua.h
#include lualib.h
#include lauxlib.h
}
class DJLCData {
public:
static DJLCData* getInstance();
/*
getLuaVarString:调用Lua全局string
luaFilename = lua文件名
varName = 所要取Lua中的变量名
*/
const char* getLuaVarString(const char* luaFileName,const char* varName);
/*
*@brief getLuaOneOfTable:调用Lua全局table中的一个元素
luaFileName = lua文件名
varName = 所要取Lua中的table变量名
keyName = 所要取Lua中的table中某一个元素的Key
*/
const char* getLuaVarOneOfTable(const char* luaFileName,const char* varName,const char* keyName);
/*
*getLuaVarTable:调用lua全局table
luaFileName = lua文件名
varName = 所要取的table变量名
(注:返回的是所有的数据)
*/
const char* getLuaVarTable(const char* luaFileName,const char* varName);
/*
callLuaFunction:调用lua函数
luaFileName = lua文件名
functionName = 所要调用Lua中的函数名
*/
const char* callLuaFunction(const char* luaFileName,const char* functionName);
/***************** lua ->C++**************/
void callCppFunction(const char* luaFileName);
private:
static int cppFunction(lua_State* ls);
static bool _isFirst;
static DJLCData* _shared;
const char* getFileFullPath(const char* fileName);
};
#endif /* defined(__uitestLua__DJLCData__) */
DJLCData.cpp
//
//DJLCData.cpp
//uitestLua
//
//Created by 杜甲 on 14-5-17.
//
//
#include DJLCData.h
bool DJLCData::_isFirst;
DJLCData* DJLCData::_shared;
DJLCData* DJLCData::getInstance()
{
if (_shared == nullptr) {
_shared = new DJLCData();
}
return _shared;
}
const char* DJLCData::getLuaVarString(const char *luaFileName, const char *varName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if (isOpen != 0) {
log(Open Lua Error:%i,isOpen);
return nullptr;
}
lua_settop(ls, 0);
lua_getglobal(ls, varName);
int statesCode = lua_isstring(ls, 1);
if (statesCode != 1) {
log(Open Lua Error : %i,statesCode);
return nullptr;
}
const char* str = lua_tostring(ls, 1);
lua_pop(ls, 1);
return str;
}
const char* DJLCData::getLuaVarOneOfTable(const char *luaFileName, const char *varName, const char *keyName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if (isOpen != 0) {
log(Open Lua Error : %i,isOpen);
return nullptr;
}
lua_getglobal(ls, varName);
int statesCode lua_istable(ls, -1);
if (statesCode != 1) {
log(Open Lua Error: %i,statesCode);
return nullptr;
}
lua_pushstring(ls, keyName);
lua_gettable(ls, -2);
const char* valueString = lua_tostring(ls, -1);
lua_pop(ls, -1);
return valueString;
}
const char* DJLCData::getLuaVarTable(const char *luaFileName, const char *varName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if (isOpen != 0) {
log(Open Lua Error:%i,isOpen);
return nullptr;
}
lua_getglobal(ls, varName);
int it = lua_gettop(ls);
lua_pushnil(ls);
string result = ;
while (lua_next(ls, it)) {
string key= lua_tostring(ls, -2);
string value = lua_tostring(ls, -1);
result = result + key + : + value +;
lua_pop(ls, 1);
}
lua_pop(ls, 1);
return result.c_str();
}
const char* DJLCData::callLuaFunction(const char *luaFileName, const char *functionName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if (isOpen) {
log(Open Lua Error:%i,isOpen);
return nullptr;
}
lua_getglobal(ls, functionName);
lua_pushstring(ls, shen);
lua_pushnumber(ls, 23);
lua_pushboolean(ls, true);
/*
lua_call
第一个参数:函数的参数个数
第二个参数:函数返回值个数
*/
lua_call(ls, 3, 1);
const char* iResult = lua_tostring(ls, -1);
return iResult;
}
void DJLCData::callCppFunction(const char *luaFileName)
{
lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
/*
Lua调用的C++的函数必须是静态的
*/
lua_register(ls, cppFunction, cppFunction);
int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
if (isOpen != 0) {
log(Open Lua Error:%i,isOpen);
return;
}
}
int DJLCData::cppFunction(lua_State *ls)
{
int luaNum= (int)lua_tonumber(ls, 1);
char* luaStr = (char*)lua_tostring(ls, 2);
log(Lua调用cpp函数时传来的两个参数:%i,%s,luaNum,luaStr);
/*
返给Lua的值
*/
lua_pushnumber(ls, 321);
lua_pushstring(ls, shenqi);
/*
返给Lua值个数
*/
return 2;
}
const char* DJLCData::getFileFullPath(const char *fileName)
{
//src//这里的//是指我的lua文件放在src这个目录下
std::string str =StringUtils::format(src//%s,fileName);
return FileUtils::getInstance()->fullPathForFilename(str).c_str();
}
hello2.lua
function myadd(x, y)
return x + y
end
luaStr = shenqi
luaTable = {name = xiaonan,age = 20}
function luaLogString(_logStr,_logNum,_logBool)
print(Lua 脚本打印从C传来的字符串:,_logStr,_logNum,_logBool)
return Call Lua function OK
end
function call_cpp(_logStr,_logNum,_logBool)
num,str = cppFunction(999,lua string)
print(从cpp函数中获得两个返回值:,num,str)
end
调用方法:
log(%s,DJLCData::getInstance()->getLuaVarString(hello2.lua, luaStr));
log(%s,DJLCData::getInstance()->getLuaVarOneOfTable(hello2.lua, luaTable, name));
log(Table = %s,DJLCData::getInstance()->getLuaVarTable(hello2.lua, luaTable));
log(Call Lua Function Back :%s,DJLCData::getInstance()->callLuaFunction(hello2.lua, luaLogString));
DJLCData::getInstance()->callCppFunction(hello2.lua);
DJLCData::getInstance()->callLuaFunction(hello2.lua, call_cpp);
cocos2d: shenqi
cocos2d: xiaonan
cocos2d: Table = name:xiaonan age:20
cocos2d: [LUA-print] Lua 脚本打印从C传来的字符串: shen 23 true
cocos2d: Call Lua Function Back :Call Lua function OK
cocos2d: Lua调用cpp函数时传来的两个参数:999,lua string
cocos2d: [LUA-print] 从cpp函数中获得两个返回值: 321 shenqi</pre>