iOS中如何调用Lua,以及Lua如何调用iOS中的功能
2012-09-06 11:07
330 查看
下面将讲解一下如何在iOS里调用Lua函数,以及Lua函数如何调用iOS本地函数。
转载请注明出处。原文出处 /article/7082831.html
lua_open 若要使用Lua,必须先初始化一个lua_State环境,以后的所有Lua相关操作都必须包含这个State。
InitLua函数主要作用是用来打开初始化Lua库
当不在使用Lua的时候记得调用lua_close来释放lua_State。
DKCALL是本次示例的一个核心函数,用来返回两个参数中较大的那个值。
lua_tonumber是从栈中指定位置获取数值。1代表第一个参数,以此类推。
lua_isnumber是用来检查栈中指定是否是数值类型
lua_pushnumber 将数值压入栈中
将这段脚本保存为s1.lua然后保存在iOS项目根目录下,并在项目中添加该文件
可以看出lefthandcall是我们定义的Lua函数,功能就是调用lhc函数并返回lhc返回的值。
而里面的lhc函数却没有申明,lhc函数是一个iOS本地函数。如何在Lua脚本中调用iOS本地函数呢?下面将仔细讲解到。
下面我们将开始在iOS项目里讲解如何调用Lua脚本中的函数
首先,我们要指定我们脚本的位置,好方面后面的调用
scriptpath保存的就是脚本文件的绝对路径
lua_loadfile是加载lua脚本文件的函数。这里我们把scriptpath值传入。
lua_pcall则是解释这个脚本文件的函数。不解释一边脚本,lua环境里就没有lhc的函数申明存在。
如果这两步都通过了,那么我们就开始映射lua脚本中lhc函数和iOS本地函数的关系了。
先前我们不是建立了一个核心函数DKCALL。那么下面我们来映射lhc到这个本地函数上来
这里可以看到我们压入了lhc函数名以及DKCALL函数地址,然后更新了全局表,用来在Lua环境中关联lhc的虚函数和DKCALL实函数之间的关系。
那么,我们就可以测试一下lua脚本了,我们来在iOS环境里执行一下Lua脚本中的lefthandcall
lua_pushnumber的作用前面讲解过,lefthandcall不是有两个参数吗,我们必须压入两次。
lua_pcall 用来做一次lua的函数调用。
第二个参数 2 代表压入的参数有两个
第三个参数 1 代表该函数只返回一个结果(脚本类都能返回多个结果)
第四个参数 0 指定一个错误处理函数,这里我们没有指定错误处理函数。
XCode Output
到这里我们看到从iOS环境里加载了一个s1.lua脚本并且调用了里面的lefthandcall函数
该函数执行过程中有一个lhc函数,lua在全局表中查找发现是一个本地函数调用,于是调用了DKCALL函数,计算并返回了一个结果
这个结果在s1.lua的脚本里打印到终端上来。
可以看出,Lua很容易就跟iOS环境结合在一起。并且我们可以使用Lua的特性来帮助我们简化iOS的开发。
转载请注明出处。原文出处 /article/7082831.html
1 lua_State *l; 2 l = lua_open();
lua_open 若要使用Lua,必须先初始化一个lua_State环境,以后的所有Lua相关操作都必须包含这个State。
void InitLua(lua_State* L) { /* Load Libraries */ luaopen_base(L); luaopen_table(L); luaL_openlibs(L); luaopen_string(L); luaopen_math(L); }
InitLua函数主要作用是用来打开初始化Lua库
lua_close(L);
当不在使用Lua的时候记得调用lua_close来释放lua_State。
int DKCALL(lua_State* L) { if (!lua_isnumber(L, 1)){ return lua_error(L); } if (!lua_isnumber(L, 2)){ return lua_error(L); } double a = lua_tonumber(L, 1); double b = lua_tonumber(L, 2); a>b?lua_pushnumber(L, a):lua_pushnumber(L, b); return 1; }
DKCALL是本次示例的一个核心函数,用来返回两个参数中较大的那个值。
lua_tonumber是从栈中指定位置获取数值。1代表第一个参数,以此类推。
lua_isnumber是用来检查栈中指定是否是数值类型
lua_pushnumber 将数值压入栈中
function lefthandcall(a, b) local c = lhc(a, b); print("LUA:", c); return c; end;
将这段脚本保存为s1.lua然后保存在iOS项目根目录下,并在项目中添加该文件
可以看出lefthandcall是我们定义的Lua函数,功能就是调用lhc函数并返回lhc返回的值。
而里面的lhc函数却没有申明,lhc函数是一个iOS本地函数。如何在Lua脚本中调用iOS本地函数呢?下面将仔细讲解到。
下面我们将开始在iOS项目里讲解如何调用Lua脚本中的函数
首先,我们要指定我们脚本的位置,好方面后面的调用
NSString *scriptpath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"s1.lua"];
scriptpath保存的就是脚本文件的绝对路径
int iError = luaL_loadfile(L, scriptpath.UTF8String); if (iError){ printf("load script fail!\n"); return iError; } iError = lua_pcall(L, 0, 0, 0); if (iError){ printf("execute script fail!\n"); return iError; }
lua_loadfile是加载lua脚本文件的函数。这里我们把scriptpath值传入。
lua_pcall则是解释这个脚本文件的函数。不解释一边脚本,lua环境里就没有lhc的函数申明存在。
如果这两步都通过了,那么我们就开始映射lua脚本中lhc函数和iOS本地函数的关系了。
先前我们不是建立了一个核心函数DKCALL。那么下面我们来映射lhc到这个本地函数上来
lua_pushstring(L, "lhc"); lua_pushcfunction(L, DKCALL); lua_settable(L, LUA_GLOBALSINDEX);
这里可以看到我们压入了lhc函数名以及DKCALL函数地址,然后更新了全局表,用来在Lua环境中关联lhc的虚函数和DKCALL实函数之间的关系。
那么,我们就可以测试一下lua脚本了,我们来在iOS环境里执行一下Lua脚本中的lefthandcall
lua_getglobal(L, "lefthandcall"); lua_pushnumber(L, 15); lua_pushnumber(L, 10);
lua_pushnumber的作用前面讲解过,lefthandcall不是有两个参数吗,我们必须压入两次。
int Error = lua_pcall( L,2,1,0 );
lua_pcall 用来做一次lua的函数调用。
第二个参数 2 代表压入的参数有两个
第三个参数 1 代表该函数只返回一个结果(脚本类都能返回多个结果)
第四个参数 0 指定一个错误处理函数,这里我们没有指定错误处理函数。
XCode Output
到这里我们看到从iOS环境里加载了一个s1.lua脚本并且调用了里面的lefthandcall函数
该函数执行过程中有一个lhc函数,lua在全局表中查找发现是一个本地函数调用,于是调用了DKCALL函数,计算并返回了一个结果
这个结果在s1.lua的脚本里打印到终端上来。
可以看出,Lua很容易就跟iOS环境结合在一起。并且我们可以使用Lua的特性来帮助我们简化iOS的开发。
相关文章推荐
- IOS中如何调用LUA,以及LUA如何调用IOS中的功能
- IOS中如何调用LUA,以及LUA如何调用IOS中的功能
- IOS中如何调用LUA,以及LUA如何调用IOS中的功能
- iOS开发~调用系统发短信以及打电话的功能
- iOS 调用系统发短信以及打电话功能
- iOS 开发调用相机以及获取相册照片功能
- 【iOS开发-94】xcode6怎么使用GIT以及如何给老得项目增加GIT功能?
- iOS 调用系统发短信以及打电话功能
- iOS 开发调用相机以及获取相册照片功能
- iOS 如何调用打电话发短信等功能
- 如何在cocos2d c++代码中调用lua以及探究
- Marvell交换机luaCLI引擎启动流程以及如何解决函数cpssInitSystem()被二次调用的问题
- ios 调用系统发短信以及打电话功能
- ios 调用系统发短信以及打电话功能
- IOS问题汇总:2015-1-9 iOS 调用系统发短信以及打电话功能
- 【iOS开发-2】Info.plist文件的初步窥探:如何增减配置以及如何用代码调用里面的值
- iOS开发:调用系统自带相机以及获取相册照片的功能实现
- Lua在vs2013的配置环境以及C++如何调用lua
- 如何用Cocos2d-x创建lua项目以及lua项目如何调用cpp文件(图文讲解)
- iOS 调用系统发短信以及打电话功能