cocos2d-x Android原生平台与Lua交互

版本: cocos2d-x

语言: C++/Java/Lua


简介


cocos2d-x原生平台Android 接入第三方SDK, 需要了解LuaJavaBridge的使用。

它封装了用于JavaLua的相互调用, 其调用通过C++为中介,简要的流程:

Lua调用Java: Lua -> C++ -> Java

Java调用Lua: Java -> C++ -> Lua

以此方式来实现数据的交互, 接下来我们分别说下这两块东西。


Lua调用Java


lua的接口文件主要在 cocos/cocos2d目录下,主要的文件是:

  • luaj.lua Lua调用Android平台的接口文件
  • luaoc.lua Lua调用苹果平台的接口文件

调用原生平台,使用的方法名均为: callStaticMethod

---------------- luaj.lua ----------------
-- 用于对参数转换为Java的类型简写
local function checkArguments(args, sig)if type(args) ~= "table" then args = {} endif sig then return args, sig end-- Java支持Lua的几种参数类型number,boolean,string, function-- 如果不存在,则按照如下程序进行转换sig = {"("}for i, v in ipairs(args) dolocal t = type(v)if t == "number" thensig[#sig + 1] = "F"elseif t == "boolean" thensig[#sig + 1] = "Z"elseif t == "function" thensig[#sig + 1] = "I"elsesig[#sig + 1] = "Ljava/lang/String;"endendsig[#sig + 1] = ")V"return args, table.concat(sig)
end--[[
@function: 调用java的接口,注意在使用的时候一定要判定是否为为Android平台
@param: className Java完整的类名
@param: methodName Java类方法名
@param: args lua传入的参数,要为table类型,否则会被转换{}
@param: sig 类型简写名,格式为:(参数简写)返回类型简写
]]
function luaj.callStaticMethod(className, methodName, args, sig)-- 检测参数args并将其转换为类型简写local args, sig = checkArguments(args, sig)return callJavaStaticMethod(className, methodName, args, sig)end
endreturn luaj

使用Lua调用Java需要注意:

  • Java的方法一定要设置为static类型
  • 一定要判定平台的类型,比如Android,IOS,Mac等
  • 一定要根据考虑不同版本对原生平台方法的支持,这个主要是防止后续增加的功能,前期版本调用错误
  • LuacallStaticMethod 注意第三个传入参数,一定要为table表数据,避免错误

在Lua项目中,针对于平台的判定相关

-- 示例1
local targetPlatform = cc.Application:getInstance():getTargetPlatform()
if (cc.PLATFORM_OS_ANDROID == targetPlatform) then-- do something
end 
-- 示例2
if device.platform == "android" then-- do something
end

checkArguments

它主要用于将Lua的参数转换为Java的类型简写,以用于获取数据,如下Java支持的Lua类型简写

Lua类型简写格式说明
numberF浮点类型
booleanZ布尔类型
functionI整数或方法
stringLjava/lang/String;字符串
V用于java方法中无返回值

这个是跟C++调用Java是类似的,但Lua没有那么多的数据类型支持,比如C++中的char, shot, long, double等。

类型简写的格式大致为: (参数类型简写)返回类型简写,简单的实例:

Java方法简写说明
void showText()“()V”无参数,无返回
int getWifiLevel()“()I”无参数,返回整型
String getSystemVersion()“()Ljava/lang/String;”无参数,返回字符串
int addNumber(final int num1, final int num2)“(II)I”参数两个整型,返回整型
boolean isGetPhoneData(final String name, final int Count)“(Ljava/lang/String;I)Z”参数分别为字符串,整型,返回布尔类型

checkArguments中存在关于类型简写的转换,但是建议了解下,以备突发情况使用。


callStaticMethod

它是Lua调用调用C++的中介接口,用于将参数相关通过C++传递给Java。它的主要实现在:

// ../frameworks/cocos2d-x/cocos/scripting/lua-bindings/manual/platform/android目录下
// CCLuaJavaBridge.cpp
void LuaJavaBridge::luaopen_luaj(lua_State *L)
{s_luaState = L;lua_newtable(L);lua_pushstring(L, "callStaticMethod");lua_pushcfunction(L, LuaJavaBridge::callJavaStaticMethod);lua_rawset(L, -3);lua_setglobal(L, "LuaJavaBridge");
}

该接口在Lua中调用后主要会有两个返回值,分别是:

  • 成功标记,布尔类型;
  • 错误编码,整数类型

如果成功,则错误编码为0,否则就是其他数值,主要的错误码有:

// CCLuaBridget.h
typedef enum {// 成功kLuaBridgeErrorOk                   = 0, // 无效的参数kLuaBridgeErrorInvalidParameters    = -1,// 类没有找到kLuaBridgeErrorClassNotFound        = -2,// 方法没有找到kLuaBridgeErrorMethodNotFound       = -3,// 执行异常kLuaBridgeErrorExceptionOccurred    = -4,// 错误的类型简写kLuaBridgeErrorMethodSignature      = -5,// 虚拟机错误kLuaBridgeErrorJavaVMError          = -6,
} LuaBridgeError;

这个错误类型与luaoc.lua的检测类型参数是相似的。官方实例:

  • Lua相关
-- LuaBridgeTest.lua 示例仅摘抄了其主体代码
function newLuaJavaBridge()local targetPlatform = cc.Application:getInstance():getTargetPlatform()if (cc.PLATFORM_OS_ANDROID ~= targetPlatform) thenreturn end -- 引用库文件local luaj = require "cocos.cocos2d.luaj"-- Java类名local className = "com/cocos2dx/sample/LuaJavaBridgeTest/LuaJavaBridgeTest"-- Java方法名local methodName = "addTwoNumbers"  -- 参数local args = {2, 3}-- 类型简写local sigs = "(II)I"-- 调用方式一: 传入两个参数获取数值local success, result = luaj.callStaticMethod(className, methodName, args, sigs)if not success thenprint("luaj error:", result)elseprint("The result is:", result)end-- 调用方式二: 传入两个参数获取结果通过Lua的回调显示日志local function callbackLua(param)if "success" == param thenprint("java call back success")endendargs = { "callbacklua", callbackLua }sigs = "(Ljava/lang/String;I)V"ok = luaj.callStaticMethod(className,"callbackLua",args,sigs)if not ok thenprint("call callback error")end
end
  • Java相关
package com.cocos2dx.sample.LuaJavaBridgeTest;// 用于java调用Lua
import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;public class LuaJavaBridgeTest
{    // Lua调用javapublic static int addTwoNumbers(final int num1,final int num2){return num1 + num2;}// Java调用Luapublic static void callbackLua(final String tipInfo,final int luaFunc){// 调用局部Lua-Function,将luaFunc结果发送给LuaCocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFunc, "success");Cocos2dxLuaJavaBridge.releaseLuaFunction(luaFunc);}
}

至此,Lua调用Java告一段落。


Java调用Lua

Java是允许调用Lua的,同Java调用C++一样。主要的接口是:

// 调用局部Lua-Function
public static native int callLuaFunctionWithString(int luaFunctionId, String value); 
// 调用全局Lua-Function
public static native int callLuaGlobalFunctionWithString(String luaFunctionName, String value); 
// retain一次Lua-Function
public static native int retainLuaFunction(int luaFunctionId); 
// release掉Lua-Function
public static native int releaseLuaFunction(int luaFunctionId); 

后续补充…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/103286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人制作开源方案 | 双轮提升搬运小车

1. 功能描述 双轮提升搬运小车是一种用于搬运和移动物体的机械设备,它通常采用双轮驱动和提升装置。一般具备以下特点: ① 双轮驱动:该小车配备两个驱动轮,通过电动机或其它动力源驱动,提供足够的动力和扭矩&#xff0…

IOT 围炉札记

文章目录 一、蓝牙二、PAN1080三、IOT OS四、通讯 物联网(英文:Internet of Things,缩写:IoT)起源于传媒领域,是信息科技产业的第三次革命。物联网是指通过信息传感设备,按约定的协议&#xff0…

社区投稿| 以安全视角,深度剖析 Sui Staking 与 LSD

本篇技术研报由 MoveBit 研究团队的 Jason 撰写 #1 Sui Staking 介绍 1.1 Sui 网络概述 Sui 网络由一组独立的验证者运行,每个验证者在自己的机器或集群上运行独立的 Sui 软件实例。 Sui 采用委托权益证明(DPoS)来确定哪些验证者参与网络…

RT-Thread SMP介绍与移植(学习)

RT-Thread SMP介绍与移植 SMP:对称多处理(Symmetrical Multi-Processing)简称SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。 RT-Thread自4.0.0版本开…

CSS 中几种常用的换行方法

1、使用 br 元素&#xff1a; 最简单的换行方法是在需要换行的位置插入 元素。例如&#xff1a; <p>This is a sentence.<br>It will be on a new line.</p>这会在 “This is a sentence.” 和 “It will be on a new line.” 之间创建一个换行。 效果&a…

centos 7 lamp owncloud

OwnCloud是一款开源的云存储软件&#xff0c;基于PHP的自建网盘。基本上是私人使用&#xff0c;没有用户注册功能&#xff0c;但是有用户添加功能&#xff0c;你可以无限制地添加用户&#xff0c;OwnCloud支持多个平台&#xff08;windows&#xff0c;MAC&#xff0c;Android&a…

微信小程序服务通知(订阅消息)定时推送消息功能

首先先说项目需求&#xff1a;向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的API是我是小程序用到的API。以及服务端用到的API&#xff1a;我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: …

VScode Invoke-Expression: 无法将参数绑定到参数“Command”,因为该参数为空字符串

打开vscode时发生错误&#xff1a;Invoke-Expression : 无法将参数绑定到参数“Command”&#xff0c;因为该参数为空字符串。 解决办法&#xff1a;在anaconda prompt base中输入&#xff1a; conda upgrade -n base -c defaults --override-channels conda

Tableau:商业智能(BI)工具

Tableau入门 1、Tableau概述2、Tableau Desktop2.1、初识Tableau Desktop2.2、Tableau工作区2.3、数据窗格与分析窗格2.4、功能区和标记卡2.4.1、列和行功能区2.4.2、标记卡2.4.3、筛选器功能区2.4.4、页面功能区2.4.5、附加功能区、图例、控件 3、Tableau视图4、Tableau工作簿…

基于springboot实现校园闲置物品交易平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园闲置物品交易平台系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&am…

STM32是什么意思?

ST 意法半导体&#xff0c;是一个公司的名字 M Microelectronics 的缩写&#xff0c;表示微控制器&#xff0c;要注意微控制器和微处理器 的区别 32 32bit的意思

javaweb:mybatis:mapper(sql映射+代理开发+配置文件之设置别名、多环境配置、顺序+注解开发)

1.0版本 sql映射文件实现 流程 首先程序进入启动类MyBatisDemo.java中&#xff0c;读取配置文件mybatis-config.xml 再由mybatis-config的mappers属性 <mappers><mapper resource"UserMapper.xml"></mapper></mappers>找到sql映射文件Use…

React18入门(第三篇)——React Hooks详解,React内置Hooks、自定义Hooks使用

文章目录 概述一、内置 Hook——useState1.1 响应式数据更新1.2 什么是 state1.3 state 特点&#xff08;一&#xff09;——异步更新1.4 state 特点&#xff08;二&#xff09;——可能会被合并1.5 state 特点&#xff08;三&#xff09;——不可变数据&#xff08;重要&#…

非肿瘤纯生信拿下7+,多种机器学习算法,搭配WGCNA。

今天给同学们分享一篇非肿瘤WGCNA机器学习的生信文章“Screening of immune-related secretory proteins linking chronic kidney disease with calcific aortic valve disease based on comprehensive bioinformatics analysis and machine learning”&#xff0c;这篇文章于2…

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

【算法-动态规划】零钱兑换问题-力扣 322

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

[ubuntu]OpenFOAM国内源码满速下载地址

下列地址可直接使用git clone&#xff0c;例如&#xff0c;打开终端&#xff0c;在终端直接将下面的复制进去&#xff1a; git clone https://e.coding.net/dyfluid/ThirdParty-6/ThirdParty-6.git即可在本地创建ThirdParty-6文件夹。如果提示你没有git&#xff0c;那么输入下面…

linux安装mysql

一、Mysql概述 MySQL 是一个开放源码的小型关联式数据库管理系统&#xff0c;开发者为瑞典 MySQL AB 公司。目前 MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;许多中小型网站为了降…

看一下链表结构

序、慢慢来才是最快的方法。 背景 链表(Linked List) 链表是一种常见的基础数据结构&#xff0c;是一种线性表。与顺序表不同的是&#xff0c;链表中的每个节点不是顺序存储的&#xff0c;而是通过节点的指针域指向到下一个节点。 1.链表的优缺点 2.链表的类型 单链表、双链表…

有了PMP证书,还用考CSPM吗?

首先结论放前面&#xff08;看个人发展要求&#xff0c;如果想有双证加持的话&#xff0c;建议可以把握这个机会去申请&#xff0c;因为现在处于政策前期&#xff0c;可以免试申请&#xff0c;未来的政策未知。如果目前已经从事项目管理且拥有pmp证书的话&#xff0c;为了以后的…