• Cocos Creator 3.x 原生 TS 交互


    前言:cocos creator3.x 变化还是比较大的,很多 api 都变了。这里给大家填个坑;

    我这里使用的是 3.5.2 版本

    Android:

    TS 调用 java: 

    官方文档:如何在 Android 平台上使用 JavaScript 直接调用 Java 方法 · Cocos Creator

    creator 中的 TS脚本:

    1. if (sys.os == sys.OS.ANDROID) {
    2. let className = "com/cocos/game/AppActivity";
    3. let methodName = "showAd_unified";
    4. let methodSignature = "()V";
    5. jsb.reflection.callStaticMethod(className, methodName, methodSignature);
    6. } else if (sys.os == sys.OS.IOS) {
    7. }
    • className: 原生工程中 类文件名路径对应脚本名称
    •  methodName: .java 文件中对应的 静态方法名称
      1. private static void showAd_unified(){
      2. activity.runOnUiThread(new Runnable() {
      3. @Override
      4. public void run() {
      5. showInsertAd();
      6. }
      7. });
      8. }
    •  methodSignature: 静态方法参数类型,也叫 方法签名

    方法签名稍微有一点复杂,最简单的方法签名是 ()V,它表示一个没有参数没有返回值的方法。其他一些例子:

    • (I)V 表示参数为一个 int,没有返回值的方法
    • (I)I 表示参数为一个 int,返回值为int的方法
    • (IF)Z 表示参数为一个 int 和一个 float,返回值为 boolean 的方法

    括号内的符号表示参数类型,括号后面的符号表示返回值类型。因为 Java 是允许函数重载的,可以有多个方法名相同但是参数返回值不同的方法,方法签名正是用来帮助区分这些相同名字的方法的。

    目前 Cocos Creator 中支持的 Java 类型签名有以下 4 种:

    Java 类型签名
    intI
    floatF
    booleanZ
    StringLjava/lang/String;

     参数可以是 0 个或任意多个,直接使用 JavaScript 中的 number、bool 和 string 就可以。

    使用示例:

    1. // 调用 hello 方法
    2. jsb.reflection.callStaticMethod("com/cocos/game/Test", "hello", "(Ljava/lang/String;)V", "this is a message from JavaScript");
    3. // 调用第一个 sum 方法
    4. var result = jsb.reflection.callStaticMethod("com/cocos/game/Test", "sum", "(II)I", 3, 7);
    5. log(result); // 10
    6. // 调用第二个 sum 方法
    7. var result = jsb.reflection.callStaticMethod("com/cocos/game/Test", "sum", "(I)I", 3);
    8. log(result); // 5

    小结:有两点需要 注意下

    1. TS 只能调用 Java 静态方法
    2. 应为 Cocos Creator 是在 GL 线程中的,所有在执行Java 方法的时候 要切换到 UI线程
      1. private static void showAd_unified(){
      2. // activity = this;
      3. // activity 是当前的 activtiy
      4. activity.runOnUiThread(new Runnable() {
      5. @Override
      6. public void run() {
      7. /// TODO
      8. }
      9. });
      10. }

    Java 调用 TS: 

    这里变化还是比较大的

    之前的方法是这个:(后来发现 runOnGLThread怎么点都不出来 )

    1. activty.runOnGLThread(new Runnable() {
    2. @Override
    3. public void run() {
    4. //相当于直接在项目运行后的console里执行代码 eval() 字符串形式
    5. Cocos2dxJavascriptJavaBridge.evalString("cc.log(\"Javascript Java bridge!\")");
    6. }
    7. });

    3.X 已经长这样:

     

    1. CocosHelper.runOnGameThread(new Runnable() {
    2. @Override
    3. public void run() {
    4. CocosJavascriptJavaBridge.evalString(String.format("cc.find('Canvas/Layout').getComponent('NativeMannager').showAnimation(%s);", value));
    5. }
    6. });

    后面参数写法和 unity 的还是很像的,先找到 对应的 Node 节点取上面的脚本再调用方法

     

     传参的时候 当参数特别长 或者 json字符串 或者 参数中有特殊字符串 的时候,需要转一下Base64

     

    1. static void callJSFunction(final String value){
    2. String strBase64 = Base64.encodeToString(value.getBytes(), Base64.DEFAULT);
    3. final String jsCall = String.format("cc.find('Canvas/Layout').getComponent('NativeMannager').showAnimation('%s');", strBase64);
    4. Log.d("AdvertisingManager",jsCall);
    5. CocosHelper.runOnGameThread(new Runnable() {
    6. @Override
    7. public void run() {
    8. CocosJavascriptJavaBridge.evalString(jsCall);
    9. //JsbBridge.sendToScript();
    10. }
    11. });
    12. }

    Ios:

    (手头没有 mac 后期补充上)

  • 相关阅读:
    长连接心跳原理与机制&&工程上踩坑与优化
    百度百家号旋转验证码识别研究
    Spring MVC 九:Context层级(基于配置)
    Articulate360在线学习课件制作工具
    CodeForces_29B
    Linux配置Java环境变量 详解
    武义县城区棚户区改造溪南区块安置房建设项目(标段一)电能管理系统的研究及应用
    量表如何分析?
    MySQL中的锁机制、MyISAM表锁、MyISAM表级锁争用情况、MyISAM并发插入Concurrent Inserts、MyISAM的锁调度
    Android Studio真机运行时提示“安装失败”
  • 原文地址:https://blog.csdn.net/nicepainkiller/article/details/126378580