CocosCreator系列——js与Java原生互相调用

CocosCreator系列——js与Java原生互相调用

前期先看一下链接: cocoscreator官方文档中的Java原生反射机制.
1.客户端基于2.2.1版本新建一个hello word工程
2.新建Test.js脚本,并导出为模块,代码如下:

const Test = {
    getVau: function (data) {
        if (cc.game) {
            cc.game.testSrt = data;
        }
        console.log('当前返回字符:', data);
    }
}
module.exports = Test;

然后在HelloWorld.js脚本中引入Test模块,在调用onBtnClick()方法时调用Java原生方法

const Test = require("Test");
cc.Class({
    extends: cc.Component,

    properties: {
        label: {
            default: null,
            type: cc.Label
        },
        // defaults, set visually when attaching this script to the Canvas
        text: 'Hello, World!',
    },

    // use this for initialization
    onLoad: function () {
        this.label.string = this.text;
        if (!cc.game) {
            cc.game = {};
            cc.game.Test = Test;
        }
    },

    onBtnClick() {
        jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getS", "()V");
        this.label.string = cc.game.testSrt;
    },

});

其中game为挂载在cc下的一个对象
这时js代码到此完毕,接下来是AppActivity.java中编辑代码
1.声明当前AppActivity并初始化:

   private static AppActivity app = null;

2.声明要存储起来的字符串变量

 public static String testStr= "测试字符串";

3.在onCreate()方法中为当前AppActivity赋值

app = this;

4.交互方法(要写成静态公开的方法)在js客户端调用此方法时,Java原生端调用js中的getVau(),并传递参数
注意:Cocos2dxJavascriptJavaBridge.evalString里面的参数在新版本中改成序列化传参,如下所示:

public static void getS(){
            app.runOnGLThread(new Runnable() {
                @Override
                public void run() {
                    Cocos2dxJavascriptJavaBridge.evalString(String.format("cc.app.Test.getVau(\"%s\")",testStr));
                }
            });
    }

至此全部完成,用你的Android studio工程打开项目真机调式就可以看到你打印的log了,因为新版本跟老版本的交互方法参数传递有区别,如果creator是1.x版本,请使用:Cocos2dxJavascriptJavaBridge.evalString(“cc.app.Test.getVau(‘”+ testStr +"‘)");这种方式传递

AppActivity.java代码如下:

package org.cocos2dx.javascript;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.content.Intent;
import android.content.res.Configuration;

public class AppActivity extends Cocos2dxActivity {
    private static AppActivity app = null;
    public static String Absd = "132132132";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        if (!isTaskRoot()) {
            // Android launched another instance of the root activity into an existing task
            //  so just quietly finish and go away, dropping the user back into the activity
            //  at the top of the stack (ie: the last state of this task)
            // Don't need to finish it again since it's finished in super.onCreate .
            return;
        }
        // DO OTHER INITIALIZATION BELOW
        SDKWrapper.getInstance().init(this);
        app = this;
    }
    public static void getS(){
            app.runOnGLThread(new Runnable() {
                @Override
                public void run() {
                    Cocos2dxJavascriptJavaBridge.evalString(String.format("cc.app.Test.getVau(\"%s\")",Absd));
                }
            });
    }
}

猜你喜欢

转载自blog.csdn.net/liupengxunzhuanshu/article/details/105789047
今日推荐