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虚拟栈,通过栈 ...
随机推荐
- jQuery在HTML文档加载完毕后自动执行某个事件;
原来onchange=“fucntionname(parms)”: <select name="country" id="selCountries_{$sn}&qu ...
- 类似桌面背景壁纸随手指滑动--第三方开源--BackgroundViewPager
Android BackgroundViewPager在github上的项目主页是:https://github.com/MoshDev/BackgroundViewPager 下载下来即可运行
- 银河英雄传说 (codevs 1540) 题解
[问题描述] 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰 ...
- 迭代器、泛型和增强For
Iterator hasNext next Iterator 迭代器 Collection提供了一个遍历集合的通用方式,迭代器(Iterator). 获取迭代器的方式是使用Collection定义的 ...
- Android--发送短信,并且通知发送方
1.发送短信涉及到权限,我们需要把权限加上 2.当我们发送短信时,不管发送是否成功,接收方是否接收到,系统都会发送广播 3.这时我们注册广播去接收一下就可以了 4.布局文件很简单,里面就两个EditT ...
- 直播源格式转换教程——rtmp/rtsp/http/m3u8!!
之前寻找直播源,发现好多rtmp开头的,或者是rtsp开头的,但是ATV里面的个人链接是支持m3u8格式的.怎么办?小编发现了几个规律,网友可作参考.现在流行的直播地址差不多就这几种需要说明的是并不是 ...
- 在WIN7下安装运行mongodb 1)、下载MongoDB
1).下载MongoDB http://downloads.mongodb.org/win32/mongodb-win32-i386-2.4.5.zip 下载Windows 32-bit版本并解压缩, ...
- SQL开发技巧(二) 【转】感觉他写的很好
本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...
- mysql开启日志
在 centos 5 下, 在 mysld 下面,添加一行 log=/var/log/mysql.log 然后执行如下命令 touch /var/log/mysql.logchmod 777 /va ...
- 从零开始学ios开发(三):第一个有交互的app
感谢大家的关注,也给我一份动力,让我继续前进.有了自己的家庭有了孩子,过着上有老下有小的生活,能够挤出点时间学习真的很难,每天弄好孩子睡觉已经是晚上10点左右了,然后再弄自己的事情,一转眼很快就到12 ...