本文主要讲如何完成lua和object-c的相互调用。       lua是一种脚本语言,可以方便的移植到各种宿主语言中,并且可以支持热更新,在游戏开发中也能当做主要的语言来编写游戏的逻辑,但是要接入第三方(例如支付宝等)时需要在不同的平台上(比如Android和ios)分别接入,这是就需要oc和lua完成通信
 
首先cocos2d 对oc和lua调用进行了封装,这就更有利于我们调用
cocos/cocos2d/luaoc
 
函数原型:
  1. -- 调用Objective-C类的接口。
  2. -- @function [parent=#luaoc] callStaticMethod
  3. -- @param string className Objective-C类名
  4. -- @param string methodName Objective-C类方法名
  5. -- @param table args Objective-C类方法所需要的各种参数字典,key值为方法的参数名
  6. -- @return boolean#boolean ret (return value: bool)  ok, mixed ret ok为是否调用成功, ok为true时,ret为Objective-C方法的返回值,ok为false时,ret为出错原因
  7. function luaoc.callStaticMethod(className, methodName, args)  
  8. end
 
———————————————————————开始—————————————————————————————————
 
 
lua调用oc
.lua代码:
 
m.applePay = function (userid, price)
        local luaoc = require("cocos.cocos2d.luaoc")
        local className = “ApplePayMoney”      —要调用的oc中的类名
        local methodName = “payMoney”    —要调用的oc中的类中的指定方法名    要注意的是:OC里被调用方法必须是类方法,也就是前面是“+”号的方法!
        local args = {callBack = m.ocCallBack,userid = “1234",price = “500"}   —要传递给OC的参数(以表的形式传输,OC层以字典的形式接收)  注意callBack参数 
        local ok = luaoc.callStaticMethod(className, methodName, args)  —调用的返回值
end
 
--oc的回调方法
m.ocCallBack = function(str)
       -- body
          print(“oc回调lua成功”..str); —str即oc回传给lua的参数
       end
end
object-C代码
 
1.创建一个类ApplePayMoney(lua中已经指定)继承自NSObject    将.m文件的后缀名改为.mm  ( 可以实现oc与c的混编 )
2.在.mm文件中引入头文件:
#import "CCLuaBridge.h"
#import "CCLuaEngine.h"
 
报错:Undefined symbols for architecture x86_64:   "CreateRSADataSigner(NSString*)时 因为在在该文件中调用了调用了DataSigner.m里面的一个方法
解决:把DataSigner.m也改成DataSigner.mm后缀
 
3.在ApplePayMoney创建一个类方法(+方法) 
//苹果内支付(供lua端调用)
+ (void)payMoney:(NSDictionary *)dict{
    NSLog(@"lua call ocFounction succeed");
    NSString *userid = [dict valueForKey:@"userid"];
    NSString *price = [dict valueForKey:@"price"];
     //这里获取lua层的数据后  对数据进行操作(例如调用支付宝接口等) 将返回的数据再通过下面的方法回传给lua层
 
    int handlerID = (int)[[dict objectForKey:@"callBack"] integerValue];  // lua传输过来的回调lua的方法名  取inergerValue    这里可以将该id缓存在oc层的一个全局变量中  在合适的位置再回调lua层
    LuaBridge::pushLuaFunctionById(handlerID); //压入需要调用的方法id
    LuaStack *stack = LuaBridge::getStack();  //获取lua栈
    stack->pushString(“oc传递给lua的参数");  //将需要传递给lua层的参数通过栈传递
    stack->executeFunction(1);  //共有1个参数 (“oc传递给lua的参数”),这里传参数 1
    LuaBridge::releaseLuaFunctionById([ApplePayMoney sharedApplePayMoney].handleID); //最后记得释放
}
 
 
———————————————————————结束—————————————————————————————————
就是这么简单
 
 
 
 
 

Lua 与 OC 相互调用的更多相关文章

  1. lua编程之lua与C相互调用

    lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作.除此之外,lua还可以通过与C函数相互调用来扩展程序功能.在C中嵌入lua脚本既可以让用户在不重新编译代码的情 ...

  2. 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法

    OS js oc相互调用(JavaScriptCore)   接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...

  3. 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js

    iOS js oc相互调用(JavaScriptCore)   从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这 ...

  4. Lua与C++相互调用

    {--1.环境--} 为了快速入手,使用了小巧快速的vc++6.0编译器 以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--} ...

  5. uLua学习笔记(三):Unity3D和Lua之间的相互调用

    这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...

  6. lua语言自学知识点----Lua与.Net相互调用

    知识点: LuaInterface作用是用来完成Lua与C#的相互调用. LuaInterface核心库:1.luainterface.dll 用于C#读取lua(放在bin目录同级) 2.luane ...

  7. iOS 关于js与OC相互调用的那些事

    最近项目上使用js调用OC,OC再次调用JS,再次在JS页面上面回显数据. 项目中使用的是WKWebview,加载网路的URL,其实就是使用WK加载出来的H5网页,在项目中用的是H5网页有个识别按钮, ...

  8. iOS js oc相互调用JavaScriptCore(一)

    原址:http://blog.csdn.net/lwjok2007/article/details/47058101 1.普通调用 从iOS7开始 苹果公布了JavaScriptCore.framew ...

  9. cocos2d-x Lua与OC互相调用

    1. Lua 调用OC 先看例子: hello.lua: -- 点击回调函数 local function notifymenuCallbackTest() local luaoc = require ...

随机推荐

  1. SQL Server 2016 共享功能目录 不可修改

    x 个人电脑上没有安装MSSQL,以前需要链接数据库写SQL,都是在{VS ->>视图->>SQL Server对象资源管理器}直接链接数据库进行访问操作的... 但是确实有些 ...

  2. 无法在Web服务器上启动调试。

    Ⅰ x 操作超时 有关详细信息,请单击"帮助" x IIS--应用程序池--找到用到的程序池--回收   2 报这个错误的时候,我的IIS应用程序池只有一个>>> ...

  3. express工程的优化和请求参数的处理

    1.让工程自动刷新 在Express的默认工程中,ejs, jade等模板的改变会立刻被渲染到浏览器中,但是js的改变不能立即刷新.这时候我们要用到一些自动刷新工具, 如 nodemon, super ...

  4. [git] 关闭 git branch 的pager

    高版本的git做了pager的调整. git diff git log git branch 等命令都用了pager, 默认的pager用了less 在我的应用里, 通常branch只有那么3,5个. ...

  5. flash cs4 如何新增自定义控件

    1. 新增控件脚本* import gfx.controls.CoreList; import gfx.core.UIComponent; import gfx.controls.CheckBox; ...

  6. python实现斐波那契数列

    https://www.cnblogs.com/wolfshining/p/7662453.html 斐波那契数列即著名的兔子数列:1.1.2.3.5.8.13.21.34.…… 数列特点:该数列从第 ...

  7. linux测试环境维护之磁盘空间维护

    常见需要定期清理的日志有: 清理oracle监听日志: 1.进入/opt/oracle/db/diag/tnslsnr/sels-186/listener/alert目录下, 执行命令: rm -rf ...

  8. 使用监听器解决路径问题,例如在jsp页面引入js,css的web应用路径

    使用监听器解决路径问题,例如在jsp页面引入js,css的web应用路径 经常地,我们要在jsp等页面引入像js,css这样的文件,但是在服务器来访问的时候,这时间就有关到相对路径与绝对路径了.像网页 ...

  9. Erlang调度器

    1. Erlang 抢占式调度 Erlang实现公平调度基于Reduction Budget(运行次数限制).每一个进程创建时初始reduction budget值为2000,任何Erlang系统中的 ...

  10. yaml语言在线可视化翻译

    yaml语言在线可视化翻译 https://editor.swagger.io/