当前位置: 首页 > news >正文

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); 

后续补充…

相关文章:

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

版本: cocos2d-x 语言: C/Java/Lua 简介 cocos2d-x原生平台Android 接入第三方SDK, 需要了解LuaJavaBridge的使用。 它封装了用于Java和Lua的相互调用, 其调用通过C为中介,简要的流程: Lua调用Java: Lua -> C -> Java J…...

17个开源的Go语言博客和CMS解决方案

Go语言,也称为Golang,是一种为构建高效、可靠和可扩展软件而设计的开源编程语言。它于2007年在Google开发,现在广泛用于开发Web应用程序、网络工具和系统软件。 为什么使用基于Go的CMS解决方案? 这些优势使Go成为开发可扩展、高…...

Jenkins 执行远程shell脚本部署jar文件问题起不来

如图:最开始的时候没有加: source /etc/profile 这一行, run.sh里面的java -jar xxxx.jar 一直执行不来。 一开始以为是Jenkins执行退出后会kill一切它启动的进程,所以加了在run.sh里面加了export BUILD_IDdontKillMe&#xff0…...

CTF网络安全题目个人导航【持续更新】

CTF-WEB导航 WEBSQLRCE反序列化文件上传SSTIXXE综合 WEB SQL [SWPUCTF 2021 新生赛]sql - 联合注入 [SWPUCTF 2021 新生赛]easy_sql - 联合注入||报错注入||sqlmap [NSSRound#1 Basic]sql_by_sql - 二次注入布尔盲注||sqlmap [NISACTF 2022]join-us - 报错注入&无列名注入…...

Matlab导入log(或txt)文件,提取数据或其他信息

导入log(或txt)文件 先上代码: clc; clear; %数据导入 file1fullfile(文件路径, test1.log); % 导入文件test1.log f1fopen(file1); dt1textscan(f1,%s); %采用textscan 读取数据 %得到的dt1是元胞数组格式比如:有如下内容文件 导入…...

GNU和Linux的关系、 Linux的发行版本、CentOs和RedHat的区别

GNU和Linux的关系 其实,我们通常称之为的"Linux"系统,相对更准确的名称应该称为“GNU/Linux”系统! 一个功能完全的操作系统需要许多不同的组成部分,其中就包括内核及其他组件;而在GNU/Linux系统中的内核就…...

如何在STM32中实现TCP通信?

如何在STM32中实现TCP通信? TCP通信在计算机网络中扮演着重要角色,实现它需要兼顾硬件和软件因素。 硬件层面,某些STM32处理器内置了Ethernet MAC,这有利于简化网络通信的部署。若处理器缺乏内置MAC,需外接以太网控制…...

Docker安装、启动、管理ElasticSearch、ElasticSearch-heade、kibana

一、ElasticSearch 1.1.镜像拉取 docker pull elasticsearch:7.17.13 1.2.启动 docker run -d --name "容器名称" -e "ES_JAVA_OPTS-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:7.17.13启动后使用docker logs查看ES启动日志&#xf…...

ACDSee Photo Studio Ultimate 2024特别版(图片编辑器)

ACDSee Photo Studio Ultimate 2024是一款功能全面、易于使用的图像编辑和管理软件,为摄影师和设计师提供了强大的工具和功能。无论您是进行基本的图像优化还是进行复杂的创作,ACDSee Photo Studio Ultimate 2024都将成为您的得力助手。 软件下载&#x…...

MySQL 3 环境搭建 MySQL 5.7版本的安装、配置

MySQL5.7.43官网下载地址 MySQL :: Download MySQL Community Server 这里选5.7.43,Windows版本,然后点击Go to Download Page,下载msi安装包的版本 MSI安装包版本比ZIP压缩包版本的安装过程要简单的多,过程更加清楚直观&#x…...

多媒体应用设计师 第2章 多媒体信息处理及编辑技术

1.多媒体信息的种类与特点 视觉类:文字、图像、图形、视频、动画、其他(视频、符号表示的数值、图形表示的某种数据曲线、数据库的关系数据) 听觉类:波形声音、语音、音乐 多媒体信息特点: 多媒体是有格式的。 越接近…...

【算法系列 | 10】深入解析查找算法之—线性查找

序言 心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第10讲,讲…...

获取操作系统信息服务器信息JVM信息cpu内存磁盘信息

1.添加依赖 <dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>5.6.0</version> </dependency>...

Android笔记(四)Activity之间传递可序列化的数据的优化处理

Activity之间传递可序列化的数据 Android应用开发会常常处理数据的序列化和传递。在Android中往往采用两种方式实现数据的可序列化&#xff1a;&#xff08;1&#xff09;实现java.io.Serializable接口&#xff08;2&#xff09;实现android.os.Parcelable接口。 将类定义为an…...

MySQL MVCC详细介绍

MVCC概念 MVCC(Multi-Version Concurrency Control) 多版本并发控制&#xff0c;是一种并发控制机制,用于处理数据库中的并发读写操作&#xff0c;它通过在每个事务中创建数据的快照&#xff0c;实现了读写操作的隔离性&#xff0c;从而避免了读写冲突和数据不一致的问题。 M…...

Element Plus阻止 el-dropdown、el-switch等冒泡事件

最近做vue3项目&#xff0c;使用Element Plus,又遇到坑了&#xff01; 问题点&#xff1a;组件中遇到事件冒泡问题了&#xff0c;el-checkbox 中 change事件要求阻止冒泡&#xff0c;如下代码中要求点击checkbox时不调用li标签的show方法 <li click"show()">…...

Spring framework Day13:注解结合Java配置类

前言 前面我们管理 bean 都是在 xml 文件中去管理&#xff0c;本次我们将介绍如何在 Java 配置类中去管理 bean。 注解结合 Java 配置类是一种常见的 Spring 注入 Bean 的方式。通常情况下&#xff0c;开发人员会使用 Java Config 来定义应用程序的配置信息&#xff0c;而在 …...

彻底卸载自己安装的python

一.彻底卸载自己安装的python Python3 安装完后&#xff0c;在系统中不同目录下存在各种依赖关系&#xff0c;若需卸载&#xff0c;需要一步步无残留完全卸载干净。 删除Python 3.7 框架&#xff0c;打开终端&#xff0c;输入 sudo rm -rf /Library/Frameworks/Python.frame…...

ES相关面试问题整理

索引模板了解么 索引模板&#xff0c;一种复用机制&#xff0c;就像一些项目的开发框架如 Laravel 一样&#xff0c;省去了大量的重复&#xff0c;体力劳动。当新建一个 Elasticsearch 索引时&#xff0c;自动匹配模板&#xff0c;完成索引的基础部分搭建。 模板定义&#xf…...

MytatisP详解

MP详解 一、基础使用1.引入2.Entry中的常用注解3.BaseMapper 、IService、ServiceImpl3.1BaseMapper 3.2IService、ServiceImpl 4.常用配置4.1 application.yml配置4.2 configuration 配置 5.Wrapper6.分页6.1使用分页方式一 7.自定义分页&#xff1a;查询指定列7.1 先用MP的分…...

变分自动编码器(VAE)百科全书从压缩到生成

一、开篇:生成模型的"概率革命" 2013 年 12 月 20 日,arXiv 上出现了一篇看似不起眼的论文: Auto-Encoding Variational Bayes Diederik P. Kingma, Max Welling University of Amsterdam 20 页的论文,引入了一个看起来"普通"的想法:让自动编码器的潜…...

不只是格式化:深入理解Mac磁盘工具里的‘分区方案’(GUID/MBR/APM),选对才能跨平台读写

不只是格式化&#xff1a;深入理解Mac磁盘工具里的‘分区方案’&#xff08;GUID/MBR/APM&#xff09;&#xff0c;选对才能跨平台读写 当你将一块移动硬盘从APFS格式化为ExFAT后&#xff0c;满心欢喜地插到Windows电脑上&#xff0c;却依然收到"需要格式化"的提示—…...

WCHUsbSerTest:串口批量自动化测试工具的原理、配置与生产实践

1. 项目概述&#xff1a;为什么我们需要一个专用的串口批量测试工具&#xff1f;在嵌入式硬件开发、工业控制或者物联网设备的生产线上&#xff0c;USB转串口芯片和模块是连接PC与目标设备最常用、最基础的桥梁。无论是给单片机烧录程序&#xff0c;还是与PLC、传感器进行数据交…...

3步打造智能设计转换桥梁:从Figma到Unity的无缝对接方案

3步打造智能设计转换桥梁&#xff1a;从Figma到Unity的无缝对接方案 【免费下载链接】UnityFigmaBridge Easily bring your Figma Documents, Components, Assets and Prototypes to Unity 项目地址: https://gitcode.com/gh_mirrors/un/UnityFigmaBridge 在现代游戏开发…...

【Perplexity诗词歌赋搜索黑科技】:20年NLP专家首度公开5大语义对齐技巧,让古诗检索准确率飙升至98.7%

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity诗词歌赋搜索黑科技全景透视 Perplexity 并非专为古籍设计的搜索引擎&#xff0c;但其基于大语言模型的实时语义理解与多源交叉验证机制&#xff0c;意外地在诗词歌赋领域展现出颠覆性能力——它不依…...

告别卡顿!用ZLMRTCClient.js和Vue3打造超低延迟WebRTC监控播放器(附完整代码)

超低延迟WebRTC监控播放器&#xff1a;基于ZLMRTCClient.js与Vue3的工程实践 在安防监控、智慧园区等对实时性要求极高的场景中&#xff0c;传统流媒体方案如HLS或FLV往往面临3-5秒甚至更高的延迟。这种延迟在关键场景下可能导致严重后果——当监控画面显示"一切正常"…...

Windows上运行安卓应用:APK安装器完整指南

Windows上运行安卓应用&#xff1a;APK安装器完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行安卓应用&#xff0c;却不想安装笨重的…...

Onyx Core API完全手册:RESTful接口详解与实战案例

Onyx Core API完全手册&#xff1a;RESTful接口详解与实战案例 【免费下载链接】Onyx Onyx 项目地址: https://gitcode.com/gh_mirrors/ony/Onyx Onyx Core是一个强大的企业级区块链平台&#xff0c;提供完整的RESTful API接口&#xff0c;让开发者能够轻松构建和管理区…...

本地视频怎么去水印?2026年实测去水印方法和软件推荐指南

为什么本地视频需要去水印 无论是从社交平台保存下来的视频&#xff0c;还是朋友转发的素材&#xff0c;视频上的水印往往会影响观看体验。特别是对于内容创作者而言&#xff0c;需要将多个平台的素材进行二次创作时&#xff0c;去除水印成了必不可少的环节。本地视频去水印不仅…...

谷歌搜索重大更新:更智能个性化,多项新功能即将上线!

谷歌搜索迈向更智能、更个性化时代曾几何时&#xff0c;谷歌搜索简洁易用&#xff0c;只需在搜索框输入关键词&#xff0c;浏览蓝色链接列表即可。然而&#xff0c;如今人工智能已层层覆盖搜索模式。2026 年谷歌 I/O 大会上&#xff0c;谷歌宣布一系列搜索更新&#xff0c;使搜…...