zoukankan      html  css  js  c++  java
  • 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!
    ");
     4         return iError;
     5     }
     6     iError = lua_pcall(L, 0, 0, 0);
     7     if (iError){
     8         printf("execute script fail!
    ");
     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的开发。

  • 相关阅读:
    maven核心概念--生命周期
    maven核心概念--插件和目标
    TDD入门demo
    第一个简单的maven项目
    java -cp用法
    TDD最佳实践
    自定义测试规则
    自定义测试执行器
    junit3对比junit4
    Junit4X系列--hamcrest的使用
  • 原文地址:https://www.cnblogs.com/liyufeng2013/p/4018330.html
Copyright © 2011-2022 走看看