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的开发。

时间: 2024-11-11 20:56:33

lua与 object-C 通信的相关文章

C\C++和Lua是如何进行通信的?

为了实现Lua和其他语言之间的通信,Lua虚拟机为C\C++提供了两个特性: 一,Lua_State状态机 lua_State主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境.Lua虚拟机通过维护这样一个虚拟栈来实现两种之间的通信,lua_State定义如下: struct lua_State {   CommonHeader;   lu_byte status;   StkId top;  /* first free slot in the stack */   gl

Lua和C++的通信流程代码实例

C++从Lua中获取一个全局变量的字符串. 1. 引入头文件 我们来看看要在C++中使用Lua,需要些什么东西 复制代码代码如下: /*    文件名:    HelloLua.h    描 述:    Lua Demo   创建人:    笨木头   创建日期:   2012.12.24 */ #ifndef __HELLO_LUA_H_#define __HELLO_LUA_H_ #include "cocos2d.h" extern "C" {#include

菜鸟学习 - Unity中的热更新 - Lua和C#通信

孙广东 2015-4-6 热更新我是个菜鸟,感谢网上的各位的奉献,这次又当一回搬运工. 准备: 1.了解Lua的语法 推荐书籍<Lua程序设计 第二版> 2.使用ULua插件进行通信 尽量早上真机.因为Bug问题特别多. 大杂烩: 更新LUa其实也是更新资源. Lua被看作一个资源么.Lua代码都是运行时才编译的,不运行的时候就如同一张图片.一段音频一样,都是文件资源:所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现"热更新".运行效率由于使用反射,所以成为它

C操作Lua虚拟栈的API

Lua是一种嵌入式语言,在C中通过Lua库来执行,Lua和C的通信要通过一个虚拟栈. C的API: 操作栈函数 1 /*压入栈函数 lua_psuhtype*/ 2 void lua_pushnil (lua_State *L); 3 void lua_pushboolean (lua_State *L, int bool); 4 void lua_pushnumber (lua_State *L, lua_Number n); 5 void lua_pushinteger (lua_State

lua 面向对象编程类机制实现

lua no class It is a prototype based language. 在此语言中没有class关键字来创建类. 现代ES6, 已经添加class类. prototype based 语言没啥优势. lua 如何构建class机制? https://github.com/fanqingsong/oopclass.lua 提供lua的 Object Oriented Programing Class 实现: 比其他实现更加轻量 https://github.com/Yonab

Lua面向对象

metatable的介绍: Lua的table可以模拟面向对象,都得益于metatable的强大之处.在一个table中,如果索引一个元素未能找到,解释器会去该table下的metatable中的__index元素中去寻找,即table.metatable.__index.xxx中寻找. 但是如果要修改table中的元素或赋值操作,但是该元素不存在,那么会在table中创建该元素,而不会去metatable.__index中寻找. 类创建方法的实现方式: --function.lua --clo

c#调用脚本语言Lua——简单Demo

配置: 1. 下载c#下的Lua支持类库.下载地址:http://files.luaforge.net/releases/luainterface/luainterface/2.0.3 将(lua51.dll\LuaInterface.dll)引用自己的项目中. 2. 修改App.config添加以下内容: <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

ios waxpatch lua语法

Wax Lua 使用方法 说一下 Wax 的特点,它支持你在脚本里使用任何 OC 的类,同样也支持你创建一个类. 使用一个类时你会这样使用: 1 2 NSString -- Returns the NSString class UIView -- Returns the UIView class 这样调用其实一个语法糖,实际上他调用的是wax.class[“UIView “],但是我们在使用的时候不需要知道这些,因为在这个框架里已经通过设置元表的方法实现了这一点. 当定义一个类的时候会是这样:

[Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培.我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者: