Cocos如何跟Android通信?

点击上方亿元程序员+关注和★星标

引言

Cocos如何跟Android通信

大家好 ,相信小伙伴们通过阅读笔者前几期的文章**《Cocos打安卓包打不出来?看看这个》,对Cocos**如何打安卓包有了一定的了解。

但是 ,除了把安卓包打出来,另外还有一个重要的就是要能够调用安卓提供的Java 方法以及监听Java发送的事件。

本文 重点介绍一下Cocos如何跟Android通信 ,如果对您或者其他人有帮助,建议转发、收藏、点赞和在看

1.为什么要跟Android通信?

通常 我们将游戏打成安卓包之后,我们还需要接入登陆、支付 或者广告 等功能,通常这些平台会提供接口给到Android原生。

因此 我们想要接入这些接口,必须要使用原生Java 去接入,接入完成后,由于游戏开发和原生的语言不同,我们还需要实现CocosAndroid的通信。

那Cocos如何实现与Android的通信呢?

2.Cocos与Android的通信

Cocos 想要与Android进行通信,通常有以下两种方法:

1.基于反射机制实现 JavaScript 与 Android 系统原生通信

通过这个方法我们不仅需要严格声明包名和函数签名,还需要严格校对参数数量以确保正常运行,步骤较为复杂。

Cocos 调用Android方法的形式如下:

typescript 复制代码
import { native } from 'cc'; 
var o = native.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)

具体需要以下几个参数:

  • className:类名,我们需要调用的静态方法的完整包名+类名,例如:com/cocos/game/Test为包名com.cocos.game中的Test类。
  • methodName:方法名,我们需要调用的静态方法的方法名,注意大小写。
  • methodSignature:方法签名,这个主要是要告诉Java,传递的参数类型和方法返回值类型。由于篇幅较长,我们在下面讲解。
  • parameters:参数列表,这个需要与上面方法签名声明的保持一致,支持 number、bool 和 string三种类型。

方法签名

方法签名的格式为**(参数类型)返回值类型**。即括号内是参数的类型,括号外为返回值的类型。示例如下:

  • ()V 表示没有参数,没有返回值
  • (I)V 表示参数为一个 int,没有返回值的方法
  • (I)I 表示参数为一个 int,返回值为 int 的方法
  • (IF)Z 表示参数为一个 int 和一个 float,返回值为 boolean 的方法
  • (ILjava/lang/String;F)Ljava/lang/String; 表示参数类型为一个 int,一个 String 和一个 float,返回值类型为 String 的方法

完整示例

typescript 复制代码
//调用包名com.cocos.game里Test类的sum静态方法,需要2个int参数,返回值为int类型
var result = native.reflection.callStaticMethod("com/cocos/game/Test", "sum", "(II)I", 3, 7);
log(result); // 10

Android 调用Cocos方法如下:

java 复制代码
// 一定要在 GL 线程中执行,调用cc.log方法
CocosHelper.runOnGameThread(new Runnable() {
    @Override
    public void run() {
        CocosJavascriptJavaBridge.evalString("cc.log(\"Hello World!\")");
    }
});

//调用Test类的helloWorld静态方法
CocosHelper.runOnGameThread(new Runnable() {
    @Override
    public void run() {
        CocosJavascriptJavaBridge.evalString("Test.helloWorld()");
    }
});

2.使用 JsbBridge 实现 JavaScript 与 Java 通信

由于 通过反射机制实现通信的方法比较复杂,Cocos 为我们准备了JsbBridge 的方法,可以理解成CocosAndroid通信的桥梁。

在Cocos这边 ,在脚本层提供了 sendToNativeonNative 两个接口,定义如下:

分别是给发送信息到Android和监听Android的事件。

javascript 复制代码
// JavaScript
export namespace bridge{
    /**
     * Send to native with at least one argument.
     */
    export function sendToNative(arg0: string, arg1?: string): void;
    /**
     * Save your own callback controller with a JavaScript function,
     * Use 'jsb.bridge.onNative = (arg0: String, arg1: String | null)=>{...}'
     * @param args : received from native
     */
    export function onNative(arg0: string, arg1?: string | null): void;
}

同样的 ,在Android 这边,也有两对应的接口, sendToScriptonScript,定义如下:

java 复制代码
// JAVA
public class JsbBridge {
    public interface ICallback{
        /**
         * Applies this callback to the given argument.
         *
         * @param arg0 as input
         * @param arg1 as input
         */
        void onScript(String arg0, String arg1);
    }
    /** Add a callback which you would like to apply
     * @param f ICallback, the method which will be actually applied. multiple calls will override
     * */
    public static void setCallback(ICallback f);
    /**
     * Java dispatch Js event, use native c++ code
     * @param arg0 input values
     */
    public static void sendToScript(String arg0, String arg1);
    public static void sendToScript(String arg0);
}

3.Cocos与Android的通信实例

1.资源准备

首先CocosCreator3.8.3 创建一个项目,然后在界面中简单添加1 个背景以及2 个按钮,分别用来测试调用Java方法监听Java事件

2.写代码

首先 添加一个Main.ts脚本,然后分别监听两个按钮的点击事件。

上面 关键的2个方法如下:

  • 调用我们在Java写好的showToast方法,传递的参数是一句话,这个方法是调用系统的消息提示。
typescript 复制代码
native.bridge.sendToNative('showToast', "Cocos调用了Java的showToast方法");
  • 通过native.bridge.onNative监听Java的事件,然后在Java写好的testJavajEvent方法进行测试监听是否成功。
typescript 复制代码
native.bridge.onNative = (arg0: string, arg1: string): void => {
        if (arg0 == 'ok') {
                native.bridge.sendToNative('showToast', "成功接收到Java的事件");
        }
        return;
}
native.bridge.sendToNative('testJavajEvent');

3.导出安卓工程

由于在前面的文章有比较详细的介绍,我们这里就不再重复描述。通过构建发布工具发布即可。

4.通过AS打开工程

找到 我们的工程目录,在项目的build->android->proj,然后用AS进行打开。

5.编写Java方法

找到 AppActivity.java,在onCreate方法中添加我们的测试代码。

上面 2个关键的方法如下:

  • 通过JsbBridge.setCallback监听我们在Cocos 发送的事件。通过第一个参数arg0来判断事件。
java 复制代码
JsbBridge.setCallback(new JsbBridge.ICallback() {
    @Override
    public void onScript(String arg0, String arg1) {
        //TO DO
        if(arg0.equals("showToast")){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), arg1,
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
        else if(arg0.equals("testJavajEvent")){
            JsbBridge.sendToScript("ok");
        }
    }
});
  • 当接收到showToast事件时,我们调用系统的消息提示。
java 复制代码
if(arg0.equals("showToast")){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(getApplicationContext(), arg1,
                    Toast.LENGTH_SHORT).show();
        }
    });
}
  • 当接收到testJavajEvent事件时,我们通过方法JsbBridge.sendToScript进行回复。
java 复制代码
if(arg0.equals("testJavajEvent")){
    JsbBridge.sendToScript("ok");
}

6.生成APK

通过 菜单栏Build->Build Bundle(s)/APK(s)->Build APK(s)生成我们的APK

打包完成 之后,通过右下角可以快速找到生成的APK

7.效果演示

点击 调用Java方法按钮成功弹出系统提示。

点击 调用监听Java 事件按钮成功接收到Java的事件,然后调用系统提示。

结语

今天 的分享到这里,如果对您或者其他人有帮助,建议转发、收藏、点赞和在看

更多实用源码 可通过阅读原文搜索"亿元程序员"获取。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《填色之旅》《方块掌机经典》《贪吃蛇掌机经典》《重力迷宫球》大家可以自行点击搜索体验。

实不相瞒,想要个在看 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

知识付费专栏

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

相关推荐
东方佑7 分钟前
使用tkinter 制作工作流ui
前端·windows·笔记·python·ui·分类
xiongxinyu108 分钟前
让一个元素水平垂直居中的方式
前端·javascript·css·面试
eclipsercp8 分钟前
《每天5分钟用Flask搭建一个管理系统》 第10章:前端集成
前端·python·flask
2301_7919008510 分钟前
HTML5与3D打印:探索网页内容的物理化可能
前端·3d·html5
努力的蚂蚁【你若】20 分钟前
Vue打包文件dist放在SpringBoot项目下运行(正确实现全过程)
前端·vue.js·spring boot
突然暴富的我38 分钟前
html三级菜单
前端·html
性野喜悲1 小时前
vue通过后台返回的数字显示不同的文字内容,多个内容用、隔开
前端·javascript·vue.js
武汉前端开发蓝风2 小时前
前端Debugger时复制的JS对象字符转JSON对象
前端·javascript·json·debugger
爱编程的鱼2 小时前
HTML如何在图片上添加文字
前端·javascript·html
顶顶年华正版软件官方2 小时前
关键帧功能怎么使用 关键帧控制视频特效怎么用 会声会影视频剪辑软件教程
前端·javascript·音视频·学习方法·关键帧·会声会影教程·视频剪辑软件