cocos creator,Android Studio,相互调用

本文主要纪录:Cocos Creator 使用TypeScript语言开发打包Android的过程中。

Typescript和Java语言的相互调用。

最新的官方文档中 https://docs.cocos.com/creator/3.8/manual/zh/advanced-topics/js-java-bridge.html 。使用 JsbBridge 实现 JavaScript 与 Java 通信

其中用到两个函数:
Java中调用TypeScript 使用 JsbBridge.sendToScript(args0,arg1); 其中 args0 用于区分Typescript接收到后该使用哪个方法去处理。args1 是 Java层要传递给Typescript的参数。

TypeScript调用Java层 使用 native.bridge.sendToNative(arg0,arg1); 其中args0 是Java层接收到的第一个参数。根据该参数识别 调用按个方法。args1 为typescript传递给jaba层的参数。

想要使用该方法需要添加注册

在Java层的注册:

  1. JsbBridge.setCallback((arg0, arg1) -> {
  2. Log.i("scriptcallBack", arg0);
  3. if (arg0.equals("login")){
  4. login();
  5. }else if(arg0.equals("logout") ){
  6. logout();
  7. }else if(arg0.equals("pay")){
  8. pay(arg1);
  9. }else if(arg0.equals("verify")){
  10. verify();
  11. }else if(arg0.equals("center")){
  12. center();
  13. }else if(arg0.equals("exit")){
  14. exit();
  15. }else if(arg0.equals("createrole")){
  16. createrole(arg1);
  17. }else if(arg0.equals("levelup")){
  18. levelup(arg1);
  19. }else if(arg0.equals("entergame")){
  20. entergame(arg1);
  21. }else if(arg0.equals("reportevent")){
  22. reportevent(arg1);
  23. }else if(arg0.equals("chkPermission")){
  24. requestPermission();
  25. }else if(arg0.equals("userAgreement")){
  26. //用户协议
  27. userAgreement();
  28. }else if(arg0.equals("privacyAgreement")){
  29. //隐私协议
  30. privacyAgreement();
  31. }else if(arg0.equals("showRewardAdVideo")){
  32. //展示广告
  33. this.showRewardAdVideo(arg1);
  34. }else if(arg0.equals("loadRewardVideoAd")){
  35. this.loadRewardVideoAd(arg1);
  36. }
  37. });
  38. }

该方法在Appactivity的OnCreate() 方法中添加

  1. public static registerNativeCallBack(){
  2. console.log("注册底层native方法的监听========");
  3. native.bridge.onNative = (arg0:string,arg1:string):void=>{
  4. console.log("底层出来的方法" + arg0 );
  5. console.log(arg1);
  6. if(arg0 == "login"){
  7. this.onLoginCallBack(arg1);
  8. }else if(arg0 == "logout"){
  9. this.onLogoutCallBack();
  10. }else if(arg0 == "pay"){
  11. this.onPayCallBack(arg1);
  12. }else if(arg0 == "verify"){
  13. this.onVerify(arg1);
  14. }else if(arg0 == "center"){
  15. this.onCenter(arg1);
  16. }else if(arg0 == "exit"){
  17. this.onExit(arg1);
  18. }else if(arg0 == "createrole"){
  19. this.onCreaterole(arg1);
  20. }else if(arg0 == "levelup"){
  21. this.onLevelup(arg1);
  22. }else if(arg0 == "entergame"){
  23. this.onEntergame(arg1);
  24. }else if(arg0 == "reportevent"){
  25. this.onReportevent(arg1);
  26. }else if(arg0 == "permission"){
  27. //sdk初始化了。可以执行登录操作了
  28. console.log("有权限了====可以执行登录了")
  29. this.isPermission = true;
  30. EventMgr.getInstance().dispatchEvent(menofvalar.ON_ANDROID_PERMISSION);
  31. }else if(arg0 == "showRewardAdVideo"){
  32. if(arg1 == "show"){
  33. console.log("广告开始展示");
  34. }else if(arg1 == "close"){
  35. console.log("广告关闭")
  36. }else if(arg1 == "ok"){
  37. console.log("广告播放完成");
  38. }else if(arg1 == "err"){
  39. console.log("广告播放错误");
  40. }
  41. }
  42. }
  43. }

该方法在Typescript中调用。进行注册。

以上两个方法很类似。

从以上两个方法来看。arg1参数只能是String类型。
发送参数的时候,需要将需要发送的参数,进行Json序列化。发送为字符串
接收到参数后,进行反序列化操作。

以上主要基于sdk的接入。

需要注意的是:款线程操作的崩溃问题

如果在TypeScript中通知java,而java层执行的操作,操作了ui的话。那么需要使用

  1. runOnUiThread(new Runnable() {
  2. @Override
  3. public void run() {}
  4. }

该方法会避免崩溃,因为他们的操作可能不在一个线程

在java转给你调用TypeScipt中的方法:如果需要操作UI。则需要这么调用。放置渲染线程和当前不在同一个线程。

  1. CocosHelper.runOnGameThread(new Runnable() {
  2. @Override
  3. public void run() {
  4. JsbBridge.sendToScript("permission");
  5. }
  6. });
2024-07-23 19:25:37  user 阅读(107) 评论(0) 标签:cocos creator,Android Studio,Java和Typescript之间的相互调用 分类:cocos creator