一,重构Android项目
1, 新建Activity(这里是:AlexActivity)继承自AppActivity
2, 编辑AndroidManifest.xml,使AlexActivity为启动Activity
二,JavaScript调用Java
1, 方法签名
方法签名稍微有一点复杂,最简单的方法签名是 ()V
,它表示一个没有参数没有返回值的方法。其他一些例子:
(I)V
表示参数为一个 int,没有返回值的方法(I)I
表示参数为一个 int,返回值为int的方法(IF)Z
表示参数为一个 int 和一个 float,返回值为 boolean 的方法
括号内的符号表示参数类型,括号后面的符号表示返回值类型。因为 Java 是允许函数重载的,可以有多个方法名相同但是参数返回值不同的方法,方法签名正是用来帮助区分这些相同名字的方法的。
目前 Cocos Creator 中支持的 Java 类型签名有以下 4 种:
2, javaScript代码
export default class AndroidHelp {
/**
* 一个string参数,没有返回
* @param msgStr 提示的内容
*/
public static showToast(msgStr: string): void {
jsb.reflection.callStaticMethod(
"com/cocos/game/AlexActivity",
"showToast",
"(Ljava/lang/String;)V",//签名
<any>msgStr
);
}
/**
* 没有参数,返回string
* 获得Android端的返回
*/
public static talk2Android(): string {
const msg: string = jsb.reflection.callStaticMethod(
"com/cocos/game/AlexActivity",
"talk2Android",
"()Ljava/lang/String;"//签名
);
return msg;
}
/**
* 2个string参数,返回string
* @param name
* @param msgStr
*/
public static hello(name: string, msgStr: string): string {
const msg: string = jsb.reflection.callStaticMethod(
"com/cocos/game/AlexActivity",
"hello",
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",//签名
<any>name,
<any>msgStr
);
return msg;
}
/**
* 2个int参数,返回int
* @param a
* @param b
*/
public static sum(a: number, b: number): number {
const total: number = jsb.reflection.callStaticMethod(
"com/cocos/game/AlexActivity",
"sum",
"(II)I",//签名
<any>a,
<any>b
);
return total;
}
}
3, java对应签名的方法
/**
* 显示吐司提示
*/
public static void showToast(final String string) {
app.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(app, string, Toast.LENGTH_LONG).show();
}
});
}
/**
* 向Cocos返回字符串
*/
public static String talk2Android() {
return "来自Android的爱❤!";
}
public static String hello(String name, String msg) {
return "android -> " + name + ": " + msg;
}
public static int sum(int a, int b) {
return a + b;
}
public static int sum(int a) {
return a + 2;
}
三,Java调用JavaScript
1,JavaScript方法
window["showInfoJSFun"] = (msgStr: string) => {
if (!isValid(this.node)) return;
this.labJavaPush.string = msgStr;
}
2, Java代码
//Java调用JavaScript
private void showInfo() {
//一定要在GL中运行
CocosHelper.runOnGameThread(new Runnable() {
@Override
public void run() {
//这里我想执行 Cocos js代码中的window.showInfo
//js代码应该是:showInfo("成功"); 转为字符串为 "showInfo("成功");"
CocosJavascriptJavaBridge.evalString("showInfoJSFun(\"Android调用JavaScript成功\");");
}
});
}
四, AlexActivity代码
package com.cocos.game;
import android.os.Bundle;
import android.widget.Toast;
import com.cocos.lib.CocosHelper;
import com.cocos.lib.CocosJavascriptJavaBridge;
import java.util.Timer;
import java.util.TimerTask;
public class AlexActivity extends AppActivity {
private static AppActivity app = null;
private Timer timer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = this;
this.testJava2JavaScript();
}
/**
* 测试Java调用JavaScript
*/
private void testJava2JavaScript() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
showInfo();
}
}, 10000); //10s后执行
}
//#region 与Cocos的通讯部分
/**
* 显示吐司提示
*/
public static void showToast(final String string) {
app.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(app, string, Toast.LENGTH_LONG).show();
}
});
}
/**
* 向Cocos返回字符串
*/
public static String talk2Android() {
return "来自Android的爱❤!";
}
public static String hello(String name, String msg) {
return "android -> " + name + ": " + msg;
}
public static int sum(int a, int b) {
return a + b;
}
public static int sum(int a) {
return a + 2;
}
//Java调用JavaScript
private void showInfo() {
//一定要在GL中运行
CocosHelper.runOnGameThread(new Runnable() {
@Override
public void run() {
//这里我想执行 Cocos js代码中的window.showInfo
//js代码应该是:showInfo("成功"); 转为字符串为 "showInfo("成功");"
CocosJavascriptJavaBridge.evalString("showInfoJSFun(\"Android调用JavaScript成功\");");
}
});
}
//#endregion
}