Cocos2d-x3.0下 Lua与C++相互调用(一)

2014-11-24 13:01:39 · 作者: · 浏览: 0

这里讲下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);
        strin