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虚拟栈,通过栈 ...
随机推荐
- input实时监听(input oninput propertychange onpropertychange)
本文实例讲述了js与jquery实时监听输入框值的oninput与onpropertychange方法.分享给大家供大家参考.具体如下: 最近做过一个项目,需求是下拉框里自动匹配关键字,具体细节是实时 ...
- 深入浅出MongoDB(一)NoSQL
从本文开始,我们一起学习一下MongoDB相关内容,在学习MongoDB之前,首先要做的就是学习NoSQL. 为什么要学习NoSQL,原因很简单,因为MongoDB是NoSQL数据库的一种,换言之,如 ...
- php 购物车的例子
网上搜到的,简单容易理解.cookie存购物车ID,db存购物车数据. //购物车session的产生代码 1 if(! $session && ! $scid) { 2 / ...
- 推荐个好东西swoole,php如虎添翼
Swoole:PHP语言的异步.并行.高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列 ...
- Python之定向爬虫Scrapy
1.Scrapy介绍 Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 ...
- spring aop 使用xml方式的简单总结
spring aop的 xml的配置方式的简单实现: 1.编写自己的切面类:配置各个通知类型 /** * */ package com.lilin.maven.service.aop; import ...
- Android 实现子View的状态跟随父容器的状态
最近自学着做东西,需要做一个效果,就是我ListView的Item点击下或者选中的时候,我Item里面的各个组件的状态要和我Item的状态保持一直,这样我就可以用XML,去根据组件的不同状态去实现不同 ...
- Android的一些常用命令提示符(cmd)指令
在<Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目>中我曾介绍过如何给Android SDK配置环境变量,现在它就有用武之地了,我们可以直接在 ...
- Windows Phone中Wallet钱包的使用
前言 Windows Phone 8中加入了钱包Wallet这个功能,这个功能非常的有意思,开发者可以通过Wallet提供的API创建获取Wallet中的商品.统一管理用户的收集优惠券.信用卡.成员资 ...
- python小算法(一)
1.长度为m的字符串a,长度为n的字符串b,(m>n) 判断b中的字母是否全在a中? O(n)最小. class Num(object): def getNum(self, m): numLis ...