这里谈下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. java实现点卡生成

    点卡主要有2部分:卡号和密码.卡号一般由数字组成,密码就不多说了. java中随机数很强大,大家可以自己查.卡号生成使用java中随机数,密码使用uuid,密码可以自己再加点东西之类的.下面是完整代码 ...

  2. cell中button怎么得到对应cell的indexpath 以及关于UITableViewCellContentView的问题

    ============================================================ 博文原创,转载请声明出处 电子咖啡-专注于移动互联网 ============ ...

  3. ListView+CheckBox两种解决方式及原因分析

    近期在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox居然能够选中(窃喜中),这么简单就搞定了,由于数据量 ...

  4. Windows XP 如何查看计算机开关机记录

    在Windows XP中,我们可以通过“事件查看器”的事件日志服务查看计算机的开.关机时间.因为事件日志服务会随计算机一起启动和关闭,并在事件日志中留下记录. 在这里有必要介绍两个ID号:6006和6 ...

  5. iOS UIScrollView 停止滑动 减速

    1.UIScrollView 减速 可能通过decelerationRate的属性来设置,它的值域是(0.0,1.0),当decelerationRate设置为0.1时,当手指touch up时就会很 ...

  6. MOCKITO 应用示例

    package com.paic.wms.service.auditflow.impl; import static org.junit.Assert.*; import java.util.Arra ...

  7. K-means clustering (K-means聚类)

    问题: K-所有值聚类是无监督学习算法 设数据集.当中,. 如果这个数据能够分为类. 把这个问题模型化: , 当中代表第类的聚点(中心点.均值). 该模型能够用EM算法进行训练: 初始化,. E步:固 ...

  8. STM32学习笔记2-系统时钟知识及程序配置

    一:基本知识 1.  STM32F103ZE有5个时钟源:HSI.HSE.LSI.LSE.PLL.   ①.HSI是快速内部时钟,RC振荡器,频率为8MHz,精度不高.   ②.HSE是快速外部时钟, ...

  9. Pyhon安装media模块

    都是教科书惹的祸,它没有说清楚.media看着很标准,其实不是python自带的库.需要安装第三方软件后才能用. 在这里http://pythonhosted.org/PyGraphics/insta ...

  10. [初探iOS开发]storyboard的使用

    storyboard的目的是为了方便的设计程序view之间的关系,使得程序员把精力都放到核心业务逻辑之上.