这里谈下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 + "\t";
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

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

Cocos2d-x3.0下一个 Lua与C++打电话给对方的更多相关文章

  1. Cocos2D v2.0至v3.x简洁转换指南(三)

    Cocos2D 3.3中的注意事项 如果你在使用Cocos2D 3.3+(是SpriteBuilder 1.3+的一部分)你将不得不替分别的换所有存在的UITouch和UITouchEvent为CCT ...

  2. JS 如何获取当前上一个月、下一个月和月份所含天数

    在数据报表查询中,经常需要设置查询的日期区间,如查询2018-02-01至2018-02-28的整月数据,这时需要提供快捷整月查询按钮: 如: 一般日期年月日之间由"-"或者&qu ...

  3. solaris X86-64下一个ORACLE战斗11.2.0.3.8在一波折叠补丁

    solaris X86-64下一个ORACLE战斗11.2.0.3.8补丁: 正确的步骤: 1.BUG6880880 .OPATCH补丁 2.BUG16902043.11.2.0.3.8补丁 情感是练 ...

  4. 如何在Cocos2D 1.0 中掩饰一个精灵(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...

  5. 如何在Cocos2D 1.0 中掩饰一个精灵(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To ...

  6. Go 语言的下一个大版本:Go 2.0 被安排上了(全面兼容1.X,改进错误处理和泛型这两大主题)

    今年 8 月 Go 开发团队公布了 Go 2.0 的设计草案,包括错误处理和泛型这两大主题.现在备受瞩目的 Go 2.0 又有了新动向 —— 昨日 Go 开发团队在其官方博客表示,Go 2 已经被安排 ...

  7. 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!

        1. 你不知道的鸿蒙(HarmonyOS)   2020年9月10日,华为开发者大会发布了鸿蒙(HarmonyOS)2.0.我在2020-9-11日也发布了全球首套鸿蒙2.0 App开发视频课 ...

  8. quick-cocos2dx在eclipse下的lua调试

    文中大部分内容来自http://cn.quick-x.com/?p=253,绿色标记部分为修改部分. 配置编译环境的基本步骤: 安装 Visual Studio 2012 安装 Java SDK 安装 ...

  9. cocos2d-x 2.2.0 如何在lua中注册回调函数给C++

    cocos2d-x内部使用tolua进行lua绑定,但是引擎并没有提供一个通用的接口让我们可以把一个lua函数注册给C++层面的回调事件.翻看引擎的lua绑定代码,我们可以仿照引擎中的方法来做.值得吐 ...

随机推荐

  1. C语言sendto()函数-经socket传送数据以及recvfrom函数《转》

    相关函数:send, sendmsg, recv, recvfrom, socket 头文件:#include <sys/types.h>   #include <sys/socke ...

  2. c#中,DataTable 过滤重复行

    虽然网上有很多DataTable过滤重复行的方法,但是本菜还是认为自己写的这个方法最靠谱,这里的参数是传递的DataTable值,返回的是一个已经过滤相同字段StuId,ExamNum的DataTab ...

  3. java中怎么判断一个字符串中包含某个字符或字符串

    public static void main(String[] args) { String str="ABC_001"; ){ System.out.println(" ...

  4. 【Demo 0007】Java基础-类扩展特性

    本章学习要点:        1.  掌握static 修饰的类,方法以及变量的功能及用法;        2.  掌握代码块(静态,非静态)的作用以及注意事项:        3.  了解基本数据类 ...

  5. C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)

    我们实现的数据结构是为了解决在执行过程中动态的开辟空间使用(比如我们不停的输入,输入的多少我们不确定) 假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有BUG,能够直接看我博客中文章:CPU对内 ...

  6. hdu5086——Revenge of Segment Tree

    Revenge of Segment Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  7. 导航条——flash导航条

    1.概述 在一些个性网站中,网站导航的首选就是flash导航条,flash导航条可以给浏览者带来更好的视觉效果,是网站个性的主要体现之一. 2.技术要点 主要应用Flash动作脚本中的Button类的 ...

  8. 使用Understand获取某个函数(方法)的静态度量指标

    在之前的一篇日志中,我简单总结了调用Understand的Perl API的方法,这里再简单总结一些经验: 在SciTools\doc\manuals\pdf目录下的understand_api.pd ...

  9. web.xml中listener作用及使用

    一.WebContextLoaderListener 监听类 它能捕捉到server的启动和停止,在启动和停止触发里面的方法做对应的操作! 它必须在web.xml 中配置才干使用,是配置监听类的 二. ...

  10. 文件比较,文件夹比较-- vimdiff,beyond compare, compare suite, WinMerge,Kdiff3

    文件比较,文件夹比较-- vimdiff,beyond compare, compare suite, WinMerge,Kdiff3  有一个项目的源码包需要比较,400M以上,这就要找个好的工具了 ...