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));
}
});
}
}