Cocos Creator 与 Android 原生层双向通信:从零跑通 JsbBridge
一个人用 Cocos Creator 做空项目练手想接安卓 SDK 练练手结果卡在第一步TS 和 Java 怎么通信这篇文章记录我从零跑通Cocos Creator → Android 原生层双向通信的完整过程包括踩的坑。接 AdMob、Firebase、支付、推送原理都一样先把这个闭环打通后面都是换汤不换药。一、先理清概念这里的 Java 不是后端很多人第一反应“接 SDK 还要写 Java 后端”不是后端。Android 原生层 Java/Kotlin跑在手机 App 里用来调第三方 SDK。Cocos 构建 Android 时会自动生成这个工程。Java 后端跑在服务器上处理 HTTP 请求、数据库。跟接 SDK 没关系。我们要写的是第一种。二、环境准备1. 依赖版本Cocos Creator 3.xJDK 11 或 17根据 Creator 版本要求Android StudioAndroid SDK NDKNDK 推荐 r18~r212. Creator 中配置路径文件 → 偏好设置 → 程序管理器设置 Android SDK 和 NDK 路径。3. 构建 Android 工程在 Creator 构建发布面板选 Android点击构建。成功后生成build/android/proj这个目录就是完整的 Android Studio 工程。三、用 Android Studio 打开原生工程打开 Android Studio →Open→ 选择build/android/proj。如果左侧看不到AppActivity.java点击Build → Select Build Variant...切换为Android视图。文件路径一般在native/engine/android/app/src/com/cocos/game/AppActivity.java四、JsbBridgeCocos 与安卓通信的桥Cocos 官方推荐用JsbBridge比传统的jsb.reflection反射方式更简单、更安全。核心就四个 API方向调用方APITS → JavaTSnative.bridge.sendToNative(event, arg)TS → JavaJavaJsbBridge.setCallback(...)的onScriptJava → TSJavaJsbBridge.sendToScript(event, arg)Java → TSTSnative.bridge.onNative (...) {}注意参数只能是字符串。复杂对象用JSON.stringify/JSON.parse。五、完整代码实战1. TS 端发消息给 Javaimport { native } from cc; // 点击按钮时调用 onClickTest() { console.log(asd); native.bridge.sendToNative(test_native, hello from ts); }2. Java 端监听 TS 消息并回传在AppActivity.java的onCreate中Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKWrapper.shared().init(this); JsbBridge.setCallback(new JsbBridge.ICallback() { Override public void onScript(String event, String arg) { android.util.Log.d(MySDKTest, onScript: event / arg); if (test_native.equals(event)) { // ⚠️ UI 操作必须回主线程 runOnUiThread(new Runnable() { Override public void run() { android.widget.Toast.makeText( AppActivity.this, 收到TS消息: arg, android.widget.Toast.LENGTH_SHORT ).show(); } }); // 回调给 TS JsbBridge.sendToScript(test_script, hello from java); } } }); }3. TS 端监听 Java 回调import { native } from cc; start() { native.bridge.onNative (event: string, arg: string | null) { console.log(收到原生消息:, event, arg); if (event test_script) { // 隐藏按钮 this.someButton.active false; } }; }六、踩坑记录点击按钮“没反应”现象TS 端console.log(asd)正常打印Java 端onScript也进来了但手机没弹 ToastTS 也没收到回调日志System.err W at com.cocos.game.AppActivity$a.onScript(SourceFile:36) System.err W at com.cocos.lib.JsbBridge.callByScript(SourceFile:5)原因JsbBridge.onScript的回调运行在Cocos 的 GL 线程不是 Android 主线程。而Toast.show()必须在有Looper的线程上执行GL 线程没有所以抛异常java.lang.RuntimeException: Cant toast on a thread that has not called Looper.prepare()异常一抛后面的sendToScript压根没执行到所以 TS 端一直收不到回调表现就是“没反应”。解决所有 UI 操作Toast、Dialog、跳转 Activity、改 View都包一层runOnUiThreadrunOnUiThread(new Runnable() { Override public void run() { Toast.makeText(AppActivity.this, xxx, Toast.LENGTH_SHORT).show(); } });sendToScript不涉及 UI任意线程都能调。如何看 Java 异常堆栈Java 堆栈的格式是at 类名.方法名(文件名:行号)看到AppActivity$a.onScript(SourceFile:36)就说明AppActivity的匿名内部类的onScript方法第 36 行出问题。想看完整堆栈adb logcat -d | grep -A 30 -B 5 AppActivity七、重要防止代码被覆盖直接改build/android/proj/.../AppActivity.java下次在 Creator 里重新构建 Android 时会被覆盖。解决方案把改好的文件放到build-templates目录build-templates/android/app/src/com/cocos/game/AppActivity.java具体路径以你工程里AppActivity.java的实际路径为准。这样每次构建都会用你的版本。八、调试技巧1. 真机日志adb devices adb logcat | grep -iE MySDKTest|cocos|jsb2. Java 端打日志android.util.Log.d(MySDKTest, xxx);3. TS 端打日志console.log(xxx);4. 改 Java 后的流程只改了 JavaAndroid Studio 直接点绿色 Run不用回 Creator 构建。改了 TS/场景/资源先回 Creator 构建再用 Android Studio Run。九、这套模式可以直接套用到所有 SDK打通之后接任何安卓 SDK 都是同一个套路示例接登录 SDKTS 按钮请求登录 ↓ sendToNative(login, {}) JavaonScript 收到 login ↓ 调用微信/Google/Firebase SDK SDK 回调登录成功拿到 token ↓ sendToScript(login_result, {token: xxx}) TSonNative 收到 login_result ↓ 保存 token进入游戏示例接激励广告TSsendToNative(show_reward_ad, {}) Java加载并展示激励视频 SDK 回调用户看完 JavasendToScript(ad_reward, {reward: 100}) TS发奖励十、总结三个核心点TS → JavasendToNative(event, arg)Java 用setCallback的onScript接。Java → TSsendToScript(event, arg)TS 用onNative接。参数只能是字符串对象用JSON.stringify/JSON.parse。UI 操作必须回主线程。只要把这条链路跑通接 AdMob、Firebase、Google Play Billing、FCM 推送都只是换中间那段 Java 逻辑。一个人练手完全够空项目 JsbBridge 一个按钮就能把安卓 SDK 接入的完整流程摸透。

相关新闻

DeepSeek Janus-Pro-7B本地部署实战:多模态理解与图像生成全流程

DeepSeek Janus-Pro-7B本地部署实战:多模态理解与图像生成全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 7:16:17 阅读更多 →
Spring Boot多环境配置:spring.profiles.active与include的区别与实操

Spring Boot多环境配置:spring.profiles.active与include的区别与实操

做后端开发的人,几乎都遇到过这类需求:同一套代码要同时部署到开发、测试、生产等不同环境,每个环境的数据库地址、日志级别、缓存连接、第三方接口密钥可能完全不同。Spring Boot 的标准解法是 profile,而在实际项目里最常碰到的…

2026/10/10 7:16:17 阅读更多 →
text-to-cad 实战:从自然语言到可制造三维模型

text-to-cad 实战:从自然语言到可制造三维模型

1. 从一句话到三维模型:text-to-cad 到底在解决什么问题第一次听到 "text-to-cad" 这个说法,很多人脑子里冒出来的画面是:对着电脑说一句"给我画个支架",屏幕上就自动长出一个带孔位的三维零件。这个想象不算…

2026/10/10 7:16:17 阅读更多 →

最新新闻

AMD锐龙AI Max PRO 400系列192GB统一内存本地推理320B大模型实践指南

AMD锐龙AI Max PRO 400系列192GB统一内存本地推理320B大模型实践指南

1. 从标题拆解出的核心命题1.1 这条消息到底在说什么先把标题里的信息拆干净。“AMD锐龙AI Max PRO 400系列”是产品线,“192GB内存”是硬件规格,“PC可跑320B模型”是能力结论。三句话串起来,讲的是同一件事:一台放在桌面上的个人…

2026/10/10 10:29:21 阅读更多 →
strata框架+RTX4090 48G本地部署qwen3.8-next-flash:解码150t/s实战调优指南

strata框架+RTX4090 48G本地部署qwen3.8-next-flash:解码150t/s实战调优指南

1. 这套组合到底在折腾什么第一次看到“strata极速运行qwen3.8-next-flash,RTX4090 48G解码150t/s”这个标题,我第一反应是:又是一个标题党。毕竟在本地推理圈子里,“极速”“炸裂”“瘫痪”这类词已经被用烂了,动不动…

2026/10/10 10:29:21 阅读更多 →
从Q-learning到CQL:离线强化学习原理与实战

从Q-learning到CQL:离线强化学习原理与实战

1. 为什么值得把强化学习从头再学一遍1.1 从“会调包”到“懂原理”的分水岭我最早接触强化学习,和很多人一样,是从跑通一个 CartPole 的 DQN 示例开始的。看着奖励曲线慢慢爬上去,心里觉得“这东西我算是入门了”。但后来真正做项目才发现&a…

2026/10/10 10:29:21 阅读更多 →
基于STM32的智能家居安防系统设计:从选型到排障实战

基于STM32的智能家居安防系统设计:从选型到排障实战

最近一直在被问同一个题目:基于STM32的智能家居安防系统设计。这名字听起来很像老掉牙的毕业设计,但真的一步步去落地,会发现里面能讲的东西其实非常多。从芯片选型、传感器信号处理,到报警逻辑怎么写、误报怎么压下去&#xff0c…

2026/10/10 10:29:20 阅读更多 →
ESP8285+MQTT:老电机远程启停与状态监控实战方案

ESP8285+MQTT:老电机远程启停与状态监控实战方案

一台电机,放在没有网线的车间角落,想远程启停、看运行状态,还要和工厂里的其他设备联动,怎么搞?这是我最近在做一个电机控制器改造项目时遇上的真实场景。最后落地方案很简单:一块 ESP8285 做主控&#xff…

2026/10/10 10:29:20 阅读更多 →
LLM应用实验管理实战:跟踪、评估与比较的完整方法论

LLM应用实验管理实战:跟踪、评估与比较的完整方法论

做实验跟踪这件事,说句实话,很多做机器学习的朋友早期都是硬着头皮上的。最早我用 Excel 记参数、在文件名里塞日期,遇到一次模型效果回退,折腾两天才发现是训练数据和前一轮不一致。后来我把这套东西换成结构化工具,才…

2026/10/10 10:28:19 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →