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

这篇具有很好参考价值的文章主要介绍了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 = {} end
    if sig then return args, sig end
 
    -- Java支持Lua的几种参数类型number,boolean,string, function
    -- 如果不存在,则按照如下程序进行转换
    sig = {"("}
    for i, v in ipairs(args) do
        local t = type(v)
        if t == "number" then
            sig[#sig + 1] = "F"
        elseif t == "boolean" then
            sig[#sig + 1] = "Z"
        elseif t == "function" then
            sig[#sig + 1] = "I"
        else
            sig[#sig + 1] = "Ljava/lang/String;"
        end
    end
    sig[#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
end

return 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类型 简写格式 说明
number F 浮点类型
boolean Z 布尔类型
function I 整数或方法
string Ljava/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) then
    return 
  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 then
    print("luaj error:", result)
  else
    print("The result is:", result)
  end

  -- 调用方式二: 传入两个参数获取结果通过Lua的回调显示日志
  local function callbackLua(param)
    if "success" == param then
      print("java call back success")
    end
  end
  args = { "callbacklua", callbackLua }
  sigs = "(Ljava/lang/String;I)V"
  ok = luaj.callStaticMethod(className,"callbackLua",args,sigs)
  if not ok then
    print("call callback error")
  end
end
  • Java相关
package com.cocos2dx.sample.LuaJavaBridgeTest;
 
// 用于java调用Lua
import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;
 
public class LuaJavaBridgeTest
{    
  // Lua调用java
  public static int addTwoNumbers(final int num1,final int num2){
    return num1 + num2;
  }

  // Java调用Lua
  public static void callbackLua(final String tipInfo,final int luaFunc){
    // 调用局部Lua-Function,将luaFunc结果发送给Lua
    Cocos2dxLuaJavaBridge.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); 

后续补充…文章来源地址https://www.toymoban.com/news/detail-717744.html

到了这里,关于cocos2d-x Android原生平台与Lua交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • win10 vs2022 搭建 cocos2d-x 3.17 开发环境

    https://cocos2d-x.org/download/ 也可以在 github 下载 https://github.com/cocos2d/cocos2d-x/tags https://docs.cocos2d-x.org/cocos2d-x/v3/zh/ https://docs.cocos2d-x.org/api-ref/cplusplus/v3x/index.html 需要 python2 , 安装后可以用 python2 的绝对路径运行 cocos 的 setup.py 如何没有把 python2 加入到环境变量, 可以修改引擎路径下

    2024年02月08日
    浏览(31)
  • 如何将cocos2d-x js打包部署到ios上 Mac M1系统

    项目环境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的项目 使用xcode软件打开上面这个文件 打开后应该是这个样子 执行编译运行就好了 可能会碰到的错误 在xcode11版本以上都会有这个错误,这是因为iOS11+废弃了system。 将上面代码修改为 解决方案地址 remove \\\"system\\\" usage by minggo ·

    2024年02月22日
    浏览(33)
  • Pygame和Cocos2d

    Pygame和Cocos2d都是 Python 中常用的游戏引擎,但它们的设计目标、特点和使用场景略有不同。 Pygame与Cocos2d,目前是使用人数最多的两个Python游戏库。根据某知名产品点评网站的数据显示,Cocos2d排名第一,Pygame排名第二。 Pygame是一种基于SDL(Simple DirectMedia Layer)的Python库,主要

    2024年01月21日
    浏览(32)
  • cocos2D插件转3D插件

    cocos2D插件转3D插件

    2024年02月16日
    浏览(32)
  • 绑定证书的cocos2d程序如何对wss长连接抓包

    点击上方 ↑ ↑ ↑ 蓝字[ 协议分析与还原 ]关注我们 “  解决在应用内绑定了证书的cocos2d应用wss长连接抓包的问题。 ” 在分析应用的过程中,不可避免地需要抓包。 没加密的还好说,随便找个工具抓下就可以分析了,有些应用数据使用tls加密了,但用的是系统内置的证书,

    2024年02月05日
    浏览(44)
  • 《入门级-Cocos2d 4.0塔防游戏开发》---第二课:游戏加载界面开发

    目录 一、开发环境介绍 二、开发内容 2.1 修改窗口的大小。 2.2 添加加载场景相关代码 2.3 添加资源 三、显示效果 四、知识点  4.1 Sprite 4.2 定时器 操作系统:UOS1060专业版本。 cocos2dx:版本 环境搭建教程: 统信UOS下配置安装cocos2dx开发环境_三雷科技的博客-CSDN博客        游

    2024年02月15日
    浏览(40)
  • cocos2dx学习之UIListView.cpp

    /**************************************************************************** Copyright (c) 2013-2017 Chukong Technologies Inc. http://www.cocos2d-x.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \\\"Software\\\"), to deal in the Software without restriction, including witho

    2024年02月11日
    浏览(30)
  • cocos2dx学习之UIListView.h

    /**************************************************************************** Copyright (c) 2013-2017 Chukong Technologies Inc. http://www.cocos2d-x.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \\\"Software\\\"), to deal in the Software without restriction, including witho

    2024年02月11日
    浏览(27)
  • cocos2dx上做边下边玩小包热更

    因为公司业务需求需要做边下边玩的小包下载,在这里记录一下思路 下载库我使用的是cocos2dx 4.x的CCDownloader来下载文件 大体思路就是hook住fileutils中的getFileData函数和isFileExist函数。 isFileExist:无论初始包里文件是否存在,只要文件是游戏的资源文件这里都要返回“文件存在”

    2024年02月03日
    浏览(28)
  • cocos2dx ​​Animate3D(二)

    扭曲旋转特效 源码 示例 瓷砖晃动特效 源码 示例 破碎的3D瓷砖特效 源码 示例 瓷砖洗牌特效 源码 示例 FadeOutTRTiles :淡出效果,从左下角到右上角 FadeOutBLTiles :淡出效果,从右上角到左下角 FadeOutUpTiles :折叠效果,从下到上 FadeOutDownTiles :折叠效果,从上到下 示例 方块消

    2024年02月05日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包