lua与 object-C 通信
IOS中如何调用LUA,以及LUA如何调用IOS中的功能
下面将讲解一下如何在iOS里调用Lua函数,以及Lua函数如何调用iOS本地函数。
转载请注明出处。原文出处 http://www.cnblogs.com/winewind/archive/2012/09/06/2673094.html
1 lua_State *l;
2 l = lua_open();
lua_open 若要使用Lua,必须先初始化一个lua_State环境,以后的所有Lua相关操作都必须包含这个State。

1 void InitLua(lua_State* L)
2 {
3 /* Load Libraries */
4 luaopen_base(L);
5 luaopen_table(L);
6 luaL_openlibs(L);
7 luaopen_string(L);
8 luaopen_math(L);
9 }

InitLua函数主要作用是用来打开初始化Lua库
1 lua_close(L);
当不在使用Lua的时候记得调用lua_close来释放lua_State。

1 int DKCALL(lua_State* L)
2 {
3 if (!lua_isnumber(L, 1)){
4 return lua_error(L);
5 }
6 if (!lua_isnumber(L, 2)){
7 return lua_error(L);
8 }
9 double a = lua_tonumber(L, 1);
10 double b = lua_tonumber(L, 2);
11 a>b?lua_pushnumber(L, a):lua_pushnumber(L, b);
12 return 1;
13 }

DKCALL是本次示例的一个核心函数,用来返回两个参数中较大的那个值。
lua_tonumber是从栈中指定位置获取数值。1代表第一个参数,以此类推。
lua_isnumber是用来检查栈中指定是否是数值类型
lua_pushnumber 将数值压入栈中
1 function lefthandcall(a, b)
2 local c = lhc(a, b);
3 print("LUA:", c);
4 return c;
5 end;
将这段脚本保存为s1.lua然后保存在iOS项目根目录下,并在项目中添加该文件
可以看出lefthandcall是我们定义的Lua函数,功能就是调用lhc函数并返回lhc返回的值。
而里面的lhc函数却没有申明,lhc函数是一个iOS本地函数。如何在Lua脚本中调用iOS本地函数呢?下面将仔细讲解到。
下面我们将开始在iOS项目里讲解如何调用Lua脚本中的函数
首先,我们要指定我们脚本的位置,好方面后面的调用
1 NSString *scriptpath = [[[NSBundle mainBundle] resourcePath]
2 stringByAppendingPathComponent:@"s1.lua"];
scriptpath保存的就是脚本文件的绝对路径

1 int iError = luaL_loadfile(L, scriptpath.UTF8String);
2 if (iError){
3 printf("load script fail!\n");
4 return iError;
5 }
6 iError = lua_pcall(L, 0, 0, 0);
7 if (iError){
8 printf("execute script fail!\n");
9 return iError;
10 }

lua_loadfile是加载lua脚本文件的函数。这里我们把scriptpath值传入。
lua_pcall则是解释这个脚本文件的函数。不解释一边脚本,lua环境里就没有lhc的函数申明存在。
如果这两步都通过了,那么我们就开始映射lua脚本中lhc函数和iOS本地函数的关系了。
先前我们不是建立了一个核心函数DKCALL。那么下面我们来映射lhc到这个本地函数上来
1 lua_pushstring(L, "lhc");
2 lua_pushcfunction(L, DKCALL);
3 lua_settable(L, LUA_GLOBALSINDEX);
这里可以看到我们压入了lhc函数名以及DKCALL函数地址,然后更新了全局表,用来在Lua环境中关联lhc的虚函数和DKCALL实函数之间的关系。
那么,我们就可以测试一下lua脚本了,我们来在iOS环境里执行一下Lua脚本中的lefthandcall
1 lua_getglobal(L, "lefthandcall");
2 lua_pushnumber(L, 15);
3 lua_pushnumber(L, 10);
lua_pushnumber的作用前面讲解过,lefthandcall不是有两个参数吗,我们必须压入两次。
1 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的开发。
lua与 object-C 通信的更多相关文章
- C/C++和Lua是如何进行通信的?
为了实现Lua和其他语言之间的通信,Lua虚拟机为C/C++提供了两个特性: Lua_State状态机 lua_State主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境.L ...
- C/C++ Lua通信
C/C++和Lua是如何进行通信的? http://www.luachina.cn/?post=38 2015-12-28 为了实现Lua和其他语言之间的通信,Lua虚拟机为C/C++提供了两个特性: ...
- [整理]Unity3D游戏开发之Lua
原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...
- Lua与游戏的不解之缘
本文转载自秦元培博客:blog.csdn.net/qinyuanpei 一.什么是Lua? Lua 是一个小巧的脚本语言,巴西里约热内卢天主教大学里的一个研究小组于1993年开发,其设计目的是为了嵌入 ...
- Lua 5.1 学习笔记
1 简介 2 语法 2.1 语法约定 2.1.1 保留关键字 2.1.2 操作符 2.1.3 字符串定义 2.2 值与类型 2.2.1 强制转换 2.3 变量 2.3.1 索引 2.3.2 环境表 2 ...
- lua 面向对象编程类机制实现
lua no class It is a prototype based language. 在此语言中没有class关键字来创建类. 现代ES6, 已经添加class类. prototype bas ...
- ios waxpatch lua语法
Wax Lua 使用方法 说一下 Wax 的特点,它支持你在脚本里使用任何 OC 的类,同样也支持你创建一个类. 使用一个类时你会这样使用: 1 2 NSString -- Returns the N ...
- Lua类和类继承实现
Lua本身是不能像C++那样直接实现继承,但我们可以用万能的table表来实现. 以下我总结了三种方式的类以及继承的实现 第一.官方的做法,使用元表实现 原理参照<Programming in ...
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
---------------------------------------------------------------------------------------------------- ...
- 如何在Lua与C/C++之间实现table数据的交换
之前在<C/C++和Lua是如何进行通信的?>一文中简单的介绍了lua与宿主之间的通信.简单的说两种不同的语言之间数据类型不一样又如何进行数据交换呢?那就是lua_State虚拟栈,通过栈 ...
随机推荐
- Oracle表变化趋势追踪记录
#DBA_HIST_SEG_STAT可以看出对象的使用趋势,构造如下SQL查询出每个时间段内数据库对象的增长量,其中DB_BLOCK_CHANGES_DELTA为块个数 select c.SNAP_I ...
- 16.python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
- 4.python中的用户交互
学习完如何写'hello world'之后,我们还是不太满意,因为这样代码就写死了,以后运行的时候都只打印一局固定的话而已. 但是,我想在程序运行后,自己手动输入内容怎么办,此时就要学习如何使用用户交 ...
- Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)
Java 逻辑运算符.位运算符.移位操作符 总结 作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...
- hdu 3152 Obstacle Course
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3152 Obstacle Course Description You are working on t ...
- android-监听网络状态
1.注册一个广播接收器,监听网络状态private void Start() { IntentFilter filter = new IntentFilter(); filter.addAction( ...
- js判断小数点几位
js如何判断小数点后有几位 <script> var n=3.143423423;alert(n.toString().split(".")[1].length); & ...
- HTTP上传文件探究
通常情况下,我们想在网页上上传一个文件的时候,会采用<input type="file">标签,但是你有没有想过,为什么通过这样一个标签,服务器端就能获取到文件数据呢? ...
- UITableView 表视图编辑
UITableViewController(表视图控制器)继承自UIViewController,自带一个tableView self.view不是UIView而是UITableView dataso ...
- 关于VS2010“ADO.NET Entity Data Model模板丢失或者添加失败问题
我最近在安装vs2010后,添加ADO.NET Entity 实体时发现,我的新建项里面并没有这个实体模型,后来我就在博问里面发表了问题,请求大家帮忙解决,悲剧的是少有人回应啊,呵呵,不过我还是在网上 ...