zoukankan      html  css  js  c++  java
  • Cocos2d-x3.0下一个 Lua与C++打电话给对方

    这里谈下Lua与C++如何实现相互通话

    原来的连接:http://blog.csdn.net/qqmcy/article/details/26052771

    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









    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    【BFS】【HDOJ-1195】Open the Lock
    hadoop经典案例
    eclipse中下载maven插件解决办法
    eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Maven
    mysql Alter 的问题
    代理模式:利用JDK原生动态实现AOP
    JAVA中关于set()和get()方法的理解及使用
    java 中 Cannot make a static reference to the non-static 解决方法
    maven clean 异常问题
    自定义scoll样式
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4646121.html
Copyright © 2011-2022 走看看