【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
2014-12-17 17:31
1041 查看
在使用Cocos2d-x 时候,难免需要C/C++调用Lua函数、数据或Lua调用C/C++函数,那么本篇讲详细介绍C/C++与Lua之间的数据、函数交互。
首先让我们来简单了解几个Lua API函数:
int luaL_dofile (lua_State *L, const char *filename) :
加载并运行指定文件,没有错误返回0
void lua_settop (lua_State *L, int index):
参数允许传入任何可接受的索引以及 0 。 它将把堆栈的栈顶设为这个索引。 如果新的栈顶比原来的大,超出部分的新元素将被填为 nil 。 如果 index 为 0 ,把栈上所有元素移除。
void lua_getglobal (lua_State *L, const char *name):
把全局变量 name 里的值压入堆栈。
void lua_pop (lua_State *L, int n):
从堆栈中弹出
void lua_pushstring (lua_State *L, const char *s):
把指针 s 指向的以零结尾的字符串压栈。 Lua 对这个字符串做一次内存拷贝(或是复用一个拷贝), 因此 s 处的内存在函数返回后,可以释放掉或是重用于其它用途。 字符串中不能包含有零字符;第一个碰到的零字符会认为是字符串的结束。
更多的API请参考:http://www.codingnow.com/2000/download/lua_manual.html
了解了以上几个函数,为了方便童鞋们使用,Himi直接贴出封装好的类 HclcData,其中主要包括如下几个功能:
1. C/C++ 调用 Lua 全局变量
2. C/C++ 调用 Lua 全局Table 某元素
3. C/C++ 调用 Lua 全局Table
4. C/C++ 调用 Lua 函数
5. Lua 调用C/C++ 函数
下面直接贴出代码:HclcData.h
HclcData.cpp
大家可以直接拿来用的,使用简单,测试如下:
首先C++测试代码:
对应测试的Test.Lua文件:
运行测试结果如下:
在Himi做这些交互时出现了如下错误:
如下图:
最后Himi发现造成此问题的原因有两种情况:
1. 是你的lua文件位置路径!
细心的童鞋应该看到,每次我使用 luaL_dofile 函数时传入的都是调用了一个getFileFullPath的函数进行获取文件的完整路径!
在HclcData中包装了一个函数:
2. 如果你是cpp调用lua函数,那么你的这个lua函数不能是local的!
反之,如果你lua调用cpp函数,同理,cpp函数肯定是static的!
另外,如果你cpp调用lua,等同于重新加载了这个lua文件,是不同的对象!因此你应该建立一个新的lua文件,主要用于交互所用!
例如你a.lua中有一个tab的成员变量,那么你使用cpp调用lua函数后,这个tab是新的对象!
最后附上HclcData和Test.lua 下载地址:http://vdisk.weibo.com/s/y0zws
OK,本篇就到这里,有什么问题及时联系Himi!
首先让我们来简单了解几个Lua API函数:
int luaL_dofile (lua_State *L, const char *filename) :
加载并运行指定文件,没有错误返回0
void lua_settop (lua_State *L, int index):
参数允许传入任何可接受的索引以及 0 。 它将把堆栈的栈顶设为这个索引。 如果新的栈顶比原来的大,超出部分的新元素将被填为 nil 。 如果 index 为 0 ,把栈上所有元素移除。
void lua_getglobal (lua_State *L, const char *name):
把全局变量 name 里的值压入堆栈。
void lua_pop (lua_State *L, int n):
从堆栈中弹出
n个元素。相当于清除!
void lua_pushstring (lua_State *L, const char *s):
把指针 s 指向的以零结尾的字符串压栈。 Lua 对这个字符串做一次内存拷贝(或是复用一个拷贝), 因此 s 处的内存在函数返回后,可以释放掉或是重用于其它用途。 字符串中不能包含有零字符;第一个碰到的零字符会认为是字符串的结束。
更多的API请参考:http://www.codingnow.com/2000/download/lua_manual.html
了解了以上几个函数,为了方便童鞋们使用,Himi直接贴出封装好的类 HclcData,其中主要包括如下几个功能:
1. C/C++ 调用 Lua 全局变量
2. C/C++ 调用 Lua 全局Table 某元素
3. C/C++ 调用 Lua 全局Table
4. C/C++ 调用 Lua 函数
5. Lua 调用C/C++ 函数
下面直接贴出代码:HclcData.h
首先C++测试代码:
最后Himi发现造成此问题的原因有两种情况:
1. 是你的lua文件位置路径!
细心的童鞋应该看到,每次我使用 luaL_dofile 函数时传入的都是调用了一个getFileFullPath的函数进行获取文件的完整路径!
在HclcData中包装了一个函数:
反之,如果你lua调用cpp函数,同理,cpp函数肯定是static的!
另外,如果你cpp调用lua,等同于重新加载了这个lua文件,是不同的对象!因此你应该建立一个新的lua文件,主要用于交互所用!
例如你a.lua中有一个tab的成员变量,那么你使用cpp调用lua函数后,这个tab是新的对象!
最后附上HclcData和Test.lua 下载地址:http://vdisk.weibo.com/s/y0zws
OK,本篇就到这里,有什么问题及时联系Himi!
相关文章推荐
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (转)
- lua教程十一----C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互 推荐
- LUA PANIC: unprotected error in call to Lua API (invalid key to 'next')问题
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- 【COCOS2DX-LUA 脚本开发之七】解决( error in function ‘addChild’. argument #2 is ‘xx’; ‘CCNode’ expected. )异常报错
- 【COCOS2DX-LUA 脚本开发之七】解决( error in function ‘addChild’. argument #2 is ‘xx’; ‘CCNode’ expected. )异常报错
- C/C++与Lua之间进行数据函数交互
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- 【COCOS2DX-LUA 脚本开发之七】解决( error in function ‘addChild’. argument #2 is ‘xx’; ‘CCNode’ expected. )异常报错
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- 【COCOS2DX-LUA 脚本开发之十】使用Lua CJSON库进行encode与decode操作完成对Json数据转化
- 【COCOS2DX-LUA 脚本开发之六】Lua强转函数解决报错及介绍两款框架 推荐
- 【COCOS2DX-LUA 脚本开发之十】使用Lua CJSON库进行encode与decode操作完成对Json数据转化
- 【COCOS2DX-LUA 脚本开发之十三】解决lua项目编译Android出现get data from file failed以及路径等问题
- 【COCOS2DX-LUA 脚本开发之十】使用Lua CJSON库进行encode与decode操作完成对Json数据转化
- 【COCOS2DX-LUA 脚本开发之一】LUA语言基础在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途