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虚拟栈,通过栈 ...
随机推荐
- nodejs服务器anywhere简介
一句话:随时随地将你的当前目录变成一个静态文件服务器的根目录. 安装 npm install anywhere -g 执行 $ anywhere // or with port $ anywhere ...
- mac下,利用homebrew安装PHP+Mysql+Nginx
具体可以参考直通车 http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-home ...
- jquery ajax跨域请求详解
本文章来给大家详细jquery中的ajax跨域请求, 在JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的jquery.ajax jsonp格式和jque ...
- How to using to code import to GL journal[AX2012]
static void THK_importLedgerJournalTrans(Args _args) { Filename fileName = "C:\\Users\\ksiu3880 ...
- sql server 跨库操作
SELECT *FROM OPENDATASOURCE('SQLOLEDB','Data Source=sql服务器名;User ID=用户名;Password=密码;').PersonDb.dbo. ...
- char const*, char*const, const char *const的区别
C++标准规定,const关键字放在类型或变量名之前等价的.所以,const char*和 char const*是一样的. const char* //常量指针---指向常量的指针----指针指 ...
- EMVTag系列14《支付环境响应数据》
1. 选择PSE支付环境响应数据 标签 长度 数据域 存在性 9102 A5 变长 FCI数据专用模板 强制 88 1 目录基本文件的SFI 强制 5F2D 2 首选语言 可选 9F11 1 发卡行代 ...
- .NET开源工作流RoadFlow-系统布署中常见错误及处理方法
1.未开启asp.net状态服务时会出现以下错误: 解决办法:开启ASP.NET STATE SERVICE服务 2.未开启应用程序池32位: 解决办法:启用32位
- ORA-08189
OS: [root@yoon ~]# more /etc/oracle-releaseOracle Linux Server release 5.7 DB: Oracle Database 11g E ...
- job不自动运行解决方法
一.plsql.新建命令窗口 用查询语句: show parameter job_queue_processes 看看job_queue_processes的值 如果你的job很多那么将这个值设大,5 ...