本文主要讲如何完成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. 2018ACM-ICPC南京区域赛M---Mediocre String Problem【exKMP】【Manacher】

    这题就单独写个题解吧.想了两天了,刚刚问了一个大佬思路基本上有了. 题意: 一个串$S$,一个串$T$,在$S$中选一段子串$S[i,j]$,在$T$中选一段前缀$T[1,k]$使得$S[i,j]T[ ...

  2. 网龙“MAD技术论坛”在榕举办 200余位技术人才共话“改变教育”

    9月16日,由网龙网络公司主办.msup协办的“MAD技术论坛”在榕举办,来自美国.香港.苏州等地的技术大牛受邀来到福州,围绕“Make a difference to education”这一论坛主 ...

  3. 基于ASP.NET Core Data Protection生成验证token

    ASP.NET Core Data Protection 不仅提供了非对称加密能力,而且提供了灵活的秘钥存储方式以及一致的加解密接口(Protect与Unprotect).Session中用到了它,C ...

  4. [No0000153]详解C# 迭代器【转】

    迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式.简单来说,迭代器模式使得你能够获取到序列中的所有元素而 ...

  5. ASP.NET MVC 系统过滤器、自定义过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  6. esxi导出ovf模板注意事项

    1.网卡配置文件注释掉MAC地址 2.编辑设置,CD/DVD选择客户端设备

  7. arcengine直连sde

    搞了半天,找了好多资料,实验好多次,终于解决.参考资料:http://www.cnblogs.com/gaxin/p/5777864.html

  8. Java中抽象类和抽象方法的区别

    抽象方法:在类中没有方法体的方法,就是抽象方法. 抽象类:含有抽象方法的类就叫抽象类. 抽象类中的抽象方法必须被实现! 如果一个子类没有实现父类中的抽象方法,则子类也成为了一个抽象类! 抽象类中的普通 ...

  9. eclipse debug模式

    eclipse debug模式 1.怎样在Eclipse中设置断点 方法/步骤 1 首先打开工程项目 2 第一种是,把鼠标移动想要设置断点的行,在行号前面空白地方双击,就会出现断点 3 第二种是,在菜 ...

  10. MyBati__mapper 中取值(#{} 或${}) 以及 parameterType为(基本类型 或复杂类型)

    参考资料: MyBatis学习笔记(三)——parameterType为基本类型时的使用方法 MyBatis的传入参数parameterType类型 1. MyBatis的传入参数parameterT ...