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年游戏主程一起学习设计模式

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

相关推荐
Erishen6 分钟前
🚀 重新定义前端组件安装体验:shadcn + Bun 的极致开发效率
前端
冬奇Lab6 分钟前
Vercel部署全攻略:从GitHub到上线,10分钟让你的前端项目免费拥有自己的域名
前端·后端·node.js
牛马1119 分钟前
Flutter Web性能优化标签解析
前端·flutter·性能优化
Bigger9 分钟前
Tauri (25)——消除搜索列表默认选中的 UI 闪动
前端·react.js·weui
李少兄21 分钟前
简单讲讲 SVG:前端开发中的矢量图形
前端·svg
前端小万22 分钟前
告别 CJS 库加载兼容坑
前端·前端工程化
恋猫de小郭22 分钟前
Flutter 3.38.1 之后,因为某些框架低级错误导致提交 Store 被拒
android·前端·flutter
JarvanMo26 分钟前
Flutter 需要 Hooks 吗?
前端
光影少年36 分钟前
前端如何虚拟列表优化?
前端·react native·react.js
Moment38 分钟前
一杯茶时间带你基于 Yjs 和 reactflow 构建协同流程图编辑器 😍😍😍
前端·后端·面试