http://dualface.github.io/blog/2013/01/27/call-objectivec-from-lua/

月初的时候,发了一篇关于 Lua 与 Java 互操作的文章,里面提到了我创建的 LuaJavaBridge 工具。现在,最新的 Lua 与 Objective-C 互操作工具也出来了。因为是专门针对 cocos2d-x 的,所以命名为 CCLuaObjcBridge。

PS: 以前的 LuaJavaBridge 也会改名为 CCLuaJavaBridge,并且参考现在 CCLuaObjcBridge 的实现,做了不少改进,完成后也会发布。

CCLuaObjcBridge(后文简称 luaoc)的功能就是从 Lua 里直接掉用“任意 Objective-C 类方法”。利用这个特性,封装各种 iOS 上的库简直碉堡了,堪称 cocos2d-x Lua 游戏开发的神器 ^_^

luaoc 的主要特征

  • 可以从 Lua 调用 Objective-C Class Method
  • 调用 Objective-C 方法时,支持 int/float/boolean/String/Lua function/Lua table 六种参数类型
  • 可以将 Lua function 作为参数传递给 Objective-C,并让 Objective-C 保存 Lua function 的引用
  • 可以从 Objective-C 调用 Lua 的全局函数,或者调用引用指向的 Lua function

主要功能和 luaj 是一样的,但相比老版本 luaj 做了一些针对 Objective-C 的调整。

luaoc 用法示例

下面的代码演示了如何调用 91 SDK:

Lua 代码:

-- 注册回调函数,在玩家离开 91 平台界面时显示一个消息
-- PS: 91 SDK 的支付接口不会直接返回状态给客户端,支付需要在服务端验证
local function callback(event)
if event == "SDKNDCOM_LEAVE_PLATFORM" then
print("充值正在进行中,稍候您就能收到金币啦")
end
end luaoc.callStaticMethod("SDKNdCom", "registerScriptHandler", {listener = callback}) -- 进入 91 的支付接口
local args = {
orderId = "order-00001001001",
coins = 1000,
}
local ok, ret = luaoc.callStaticMethod("SDKNdCom", "payForCoins", args)
if not ok then
print(string.format("SDKNdCom.payForCoins() - call API failure, error code: %s", tostring(ret)))
end

下面代码是 Objective-C 写的中间层,用来沟通 91 SDK 和 Lua 代码。

Objective-C 代码:

+ (NSDictionary *) payForCoins:(NSDictionary *)dict
{
NSString *orderId = [dict objectForKey:@"orderId"];
if (!orderId || [orderId length] == 0)
{
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
orderId = [(NSString *)string autorelease];
} int coins = 0;
if ([dict objectForKey:@"coins"])
{
coins = [[dict objectForKey:@"coins"] intValue];
} NSString *description = [dict objectForKey:@"description"];
if (!description)
{
description = @"";
} int ret = [[NdComPlatform defaultPlatform] NdUniPayForCoin:orderId
needPayCoins:coins
payDescription:description]; return [NSDictionary dictionaryWithObjectsAndKeys:orderId, @"orderId",
[NSNumber numberWithInt:ret], @"error", nil];
}

由于无法直接获取 Objective-C 方法的参数个数和类型,所以如果要从 Objective-C 方法里接收 Lua 传递的参数,那么只能以 NSDictionary 的形式。

上述代码中,Lua 端传递了一个包含 orderId 和 coins 的表格作为参数。这个表格会被 luaoc 自动转换为 NSDictionary 对象,并传入 payForCoins:(NSDictionary*) 方法。

不过从 Objective-C 返回值给 Lua 时,就可以返回各种类型的值。目前支持的值类型有 int/float/BOOL/NSString/NSDictionary。特别是可以返回 NSDictionary 类型后,Lua 代码从 Objective-C 端获取数据就简单很多了。

从 Objective-C 调用 Lua

由于 CCLuaObjcBridge 已经集成到quick-cocos2d-x(一个基于 cocos2d-x 的 Lua 游戏引擎)中,所以从 Objective-C 调用 Lua 也更简单灵活:

// functionId 是 Lua function 的引用 ID,参考 LuaJavaBridge 文章中的描述

// 1. 将引用 ID 对应的 Lua function 放入 Lua stack
CCLuaObjcBridge::pushLuaFunctionById(functionId); // 2. 将需要传递给 Lua function 的参数放入 Lua stack
CCLuaValueDict item;
item["title"] = CCLuaValue::stringValue("hello");
item["coins"] = CCLuaValue::intValue(1000);
item["success"] = CCLuaValue::booleanValue(TRUE);
CCLuaObjcBridge::getStack()->pushCCLuaValueDict(item); // 3. 执行 Lua function
CCLuaObjcBridge::getStack()->executeFunction(1); // 4. 释放引用 ID
CCLuaObjcBridge::releaseLuaFunctionById(callbackId);

CCLuaObjcBridge::getStack() 会返回一个 CCLuaStack 对象的指针。
CCLuaStack 是 quick-cocos2d-x 引入的新对象,封装了 Lua stack 的一些常用操作。例如要将值放入 Lua stack 就提供了下列方法,支持各种数据类型:
void pushInt(int intValue);
void pushFloat(float floatValue);
void pushBoolean(bool boolValue);
void pushString(const char* stringValue);
void pushString(const char* stringValue, int length);
void pushNil(void);
void pushCCObject(CCObject* objectValue, const char* typeName);
void pushCCLuaValue(const CCLuaValue& value);
void pushCCLuaValueDict(const CCLuaValueDict& dict);
void pushCCLuaValueArray(const CCLuaValueArray& array);
相比 LuaJavaBridge,CCLuaObjcBridge 更容易使用、传递数据也更方便。以后 LuaJavaBridge 也会更名为 CCLuaJavaBridge,并使用相同的值传递机制。

CCLuaObjcBridge - Lua 与 Objective-C 互操作的简单解决方案的更多相关文章

  1. LuaJavaBridge - Lua 与 Java 互操作的简单解决方案

    http://dualface.github.io/blog/2013/01/01/call-java-from-lua/ 最近在游戏里要集成中国移动的 SDK,而这些 SDK 都是用 Java 编写 ...

  2. LuaJavaBridge - lua与java互操作的简单解决方案

    引入:Android平台代码和Lua代码的交互均通过C++和Java交互,Lua再和C++交互(lua  <==> C++ <==> java) 我最开始遇见这种lua调用ja ...

  3. vue-router同路由$router.push不跳转一个简单解决方案

    vue-router同路由$router.push不跳转一个简单解决方案 vue-router跳转一般是这么写: toCurrentPage: function(thisId){ this.$rout ...

  4. Lua基本语法-lua与C#的交互(相当简单详细的例子)

    lua脚本 与 C#的交互 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# -- ...

  5. 团队交流合作简单解决方案:TeamViewer远程控制&会议演示 + HyperCam屏幕录制(免费)

    一. 教程摘要 做开发,团队合作是少不了的.而在合作中,有一部分是花在交流讨论上,其中包括初期的任务分配,成员的进度汇报,以及资源和心得分享等.该教程介绍了两个免费的软件,搭配起来,适合人数不超过25 ...

  6. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...

  7. 转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合

    需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...

  8. 基于Annotation与SpringAOP的缓存简单解决方案

    前言: 由于项目的原因,需要对项目中大量访问多修改少的数据进行缓存并管理,为达到开发过程中通过Annotation简单的配置既可以完成对缓存的设置与更新的需求,故而设计的该简易的解决方案. 涉及技术: ...

  9. [项目回顾]基于Annotation与SpringAOP的缓存简单解决方案

    前言: 由于项目的原因,需要对项目中大量访问多修改少的数据进行缓存并管理,为达到开发过程中通过Annotation简单的配置既可以完成对缓存的设置与更新的需求,故而设计的该简易的解决方案. 涉及技术: ...

随机推荐

  1. js的解析顺序 作用域 严格模式

    一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a); 2 var a = 1; 如果执行顺序是从上到 ...

  2. Iozone

    参考地址:iozone使用技巧.iozone和Fio安装测试说明 iozone介绍 iozone(www.iozone.org)是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统 ...

  3. css 页面特殊显示效果

    1.移动端最小设置字体为12px,如果想要更小字体效果: -webkit-transform:scale(0.9); 2.文字超过两行时,末尾显示点点的效果: overflow:hidden;text ...

  4. Tomcat 笔记-设置虚拟主机

    通过作用虚拟主机,可以使多个不同域名的网站共存于一个Tomcat中 在tomcat的server.xml文件中添加主机名: <Host name="hostname" app ...

  5. Linux.杀毒.Centos安装杀毒软件Clam

    Linux系统用了几年, 甚少中毒 但前不久在阿里云的服务器被种马,折腾了几周才解决干净 感觉还是装个杀毒/马软件定期扫一扫比较稳妥, 这个Clam是免费的, 安装和配置办法记录如下: 已验证适用环境 ...

  6. Single linked List by pointer

    其实本应该从一般性的表讲起的,先说顺序表,再说链表 .但顺序表的应用范围不是很广,而且说白了就是数组的高级版本,他的优势仅在于两点:1.逻辑直观,易于理解.2.查找某个元素只需要常数时间--O(1), ...

  7. LeetCode 381. Insert Delete GetRandom O(1) - Duplicates allowed (插入删除和获得随机数 常数时间 允许重复项)

    Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ...

  8. [http服务]

    [http服务] CentOS 6 httpd 程序环境 记录了httpd的主进程编号: v 主程序文件: /usr/sbin/httpd /usr/sbin/httpd.worker /usr/sb ...

  9. Java基础笔记3

    控制语句 1. if语句 if(条件){ //如果条件成立,则运行该大括号内的内容. } if(条件){ //如果条件成立,则运行该大括号内的内容. }else{ //如果条件不成立,则运行该大括号内 ...

  10. Ionic3 一些命令

    ionic start --help E:\Projects\ionic>ionic start --help ionic start - Create a new project This c ...