一.JS调用Android

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法。它的使用方法很简单:

Java

var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)

1

varo=jsb.reflection.callStaticMethod(className,methodName,methodSignature,parameters...)

在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回值。下面介绍的类名和方法签名可能会有一点奇怪,但是Java的规范就是如此的。

类名

参数中的类名必须是包含Java包路径的完整类名,例如我们在org.cocos2dx.javascript这个包下面写了一个Test类:

Java

package org.cocos2dx.javascript;

public class Test {

public static void hello(String msg){

System.out.println(msg);

}

public static int sum(int a, int b){

return a + b;

}

public static int sum(int a){

return a + 2;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

packageorg.cocos2dx.javascript;

publicclassTest{

publicstaticvoidhello(Stringmsg){

System.out.println(msg);

}

publicstaticintsum(inta,intb){

returna+b;

}

publicstaticintsum(inta){

returna+2;

}

}

那么这个Test类的完整类名应该是org/cocos2dx/javascript/Test,注意这里必须是斜线/,而不是在Java代码中我们习惯的点.。

方法名

方法名很简单,就是方法本来的名字,例如sum方法的名字就是sum。

方法签名

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

(I)V表示参数为一个int,没有返回值的方法

(I)I表示参数为一个int,返回值为int的方法

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

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

目前Cocos2d-js中支持的Java类型签名有下面4种:

Java类型 签名

int I

float F

boolean Z

String Ljava/lang/String;

参数

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

使用示例

我们将会调用上面的Test类中的静态方法:

Java

//调用hello方法

jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test", "hello", "(Ljava/lang/String;)V", "this is a message from js");

//调用第一个sum方法

var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test", "sum", "(II)I", 3, 7);

cc.log(result); //10

//调用第二个sum方法

var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test", "sum", "(I)I", 3);

cc.log(result); //5

1

2

3

4

5

6

7

8

9

10

//调用hello方法

jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test","hello","(Ljava/lang/String;)V","this is a message from js");

//调用第一个sum方法

varresult=jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test","sum","(II)I",3,7);

cc.log(result);//10

//调用第二个sum方法

varresult=jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test","sum","(I)I",3);

cc.log(result);//5

注意

另外有一点需要注意的就是,在android应用中,cocos的渲染和js的逻辑是在gl线程中进行的,而android本身的UI更新是在app的ui线程进行的,所以如果我们在js中调用的Java方法有任何刷新UI的操作,都需要在ui线程进行。

例如,在下面的例子中我们会调用一个Java方法,它弹出一个android的Alert对话框。

Java

//给我们熟悉的AppActivity类稍微加点东西

public class AppActivity extends Cocos2dxActivity {

private static AppActivity app = null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

app = this;

}

public static void showAlertDialog(final String title,final String message) {

//这里一定要使用runOnUiThread

app.runOnUiThread(new Runnable() {

@Override

public void run() {

AlertDialog alertDialog = new AlertDialog.Builder(app).create();

alertDialog.setTitle(title);

alertDialog.setMessage(message);

alertDialog.setIcon(R.drawable.icon);

alertDialog.show();

}

});

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//给我们熟悉的AppActivity类稍微加点东西

publicclassAppActivityextendsCocos2dxActivity{

privatestaticAppActivityapp=null;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

app=this;

}

publicstaticvoidshowAlertDialog(finalStringtitle,finalStringmessage){

//这里一定要使用runOnUiThread

app.runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

AlertDialogalertDialog=newAlertDialog.Builder(app).create();

alertDialog.setTitle(title);

alertDialog.setMessage(message);

alertDialog.setIcon(R.drawable.icon);

alertDialog.show();

}

});

}

}

然后我们在js中调用

Java

jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "showAlertDialog", "(Ljava/lang/String;Ljava/lang/String;)V", "title", "hahahahha");

1

jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity","showAlertDialog","(Ljava/lang/String;Ljava/lang/String;)V","title","hahahahha");

这样调用你就可以看到一个android原生的Alert对话框了。

二.Android调用JS

Android平台

在v1.6以前可以直接使用:

Java

Cocos2dxJavascriptJavaBridge.evalString("你的代码");

1

Cocos2dxJavascriptJavaBridge.evalString("你的代码");

v1.7以后只能用以下方式:

Java

Cocos2dxHelper.runOnGLThread(new Runnable() {

@Override

public void run() {

Cocos2dxJavascriptJavaBridge.evalString("你的代码");

}

});

1

2

3

4

5

6

Cocos2dxHelper.runOnGLThread(newRunnable(){

@Override

publicvoidrun(){

Cocos2dxJavascriptJavaBridge.evalString("你的代码");

}

});

可以调用脚本中声明的任何开放功能

三.补充  IOS调用JS

ios平台

在v1.6以前是引入#include “ScriptingCore.h”,然后使用以下方法:

Java

//引入头文件

#include "ScriptingCore.h"

//使用

ScriptingCore::getInstance()->executeString("你的代码");

1

2

3

4

//引入头文件

#include"ScriptingCore.h"

//使用

ScriptingCore::getInstance()->executeString("你的代码");

到了v1.7以后,JS 引擎的管理从 ScriptingCore 被移动到了 se::ScriptEngine 类中。于是变成下面方式:

Java

//引入头文件

#include "cocos/scripting/js-bindings/manual/ScriptingCore.h"

#include "cocos/scripting/js-bindings/jswrapper/SeApi.h"

//使用

se::ScriptEngine* se = se::ScriptEngine::getInstance();

se->evalString("你的代码");

1

2

3

4

5

6

//引入头文件

#include"cocos/scripting/js-bindings/manual/ScriptingCore.h"

#include"cocos/scripting/js-bindings/jswrapper/SeApi.h"

//使用

se::ScriptEngine*se=se::ScriptEngine::getInstance();

se->evalString("你的代码");

参考资料:

https://blog.csdn.net/zwc2xm/article/details/50901140

https://www.jianshu.com/p/5fbadfc4e4fc

java中JSB,Cocos Creator 利用JSB进行JS和Android相互调用相关推荐

  1. 前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...

    Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得 < type="text/javascript"> < type="text/java ...

  2. cocos creator利用ShareSDK实现微信登录功能

    首先在ShareSDK官网下载SDK或者在android studio中配置build.gradle. ShareSDK Maven集成文档 注:使用ShareSDK maven集成方式,不需要在An ...

  3. java与js交互,相互调用传参

    随着前端技术的发展与H5的广泛使用,移动端采用native+h5的方式越来越多了,对于Android来说就涉及到java与js的交互,相互调用传参等.下面就来看一下java与js交互的简单demo. ...

  4. java 多个项目间事物_Java-web-多个独立项目之间相互调用实践

    本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...

  5. java中你知道怎么利用hashSet去重吗?

    一只IT界中的菜鸟,我立志做一只最菜的鸟 授人以鱼不如授人以渔 作为一个程序猿我们要有一个善于分析你所见到的产品,最起码你要知道让你做你能不能实现功能 话不多说进入主题 去重作用就是保证数据的唯一性, ...

  6. java中rhino什么用_使用require.js和Java / Rhino解析模块

    小编典典 require.js在rhino上运行良好.最近,我在一个项目中使用了它. 您必须确保使用r.js(不是require.js),犀牛的require.js的修改版本. 您必须扩展Scrita ...

  7. python中如何解决类互相调用问题_python中同一个类,带参的方法直接如何相互调用...

    我想在test_api1方法调用GetExecl时配置参数:(为了去掉循环语句,可以访问execl中指定行) def GetExecl(b1,self): testCaseFile = xlrd.op ...

  8. android中数据集成,移动数据终端 - 移动应用的集成-Android集成调用 | 快逸报表工具用户手册...

    接口文件说明 Android提供的接口包对应的文件目录结构及相关的说明如下: 按照以上目录结果对文件进行拷贝后,需要对AndroidManifest.xml文件进行合并或拷贝: 对所有的的内容进行拷贝 ...

  9. java中怎么创建表格_Java中的表格怎么利用表格模型进行创建

    Java中的表格怎么利用表格模型进行创建 发布时间:2020-12-03 16:44:43 来源:亿速云 阅读:89 作者:Leah 本篇文章给大家分享的是有关Java中的表格怎么利用表格模型进行创建 ...

最新文章

  1. 漫画:什么是 “设计模式” ?
  2. php方法中有%3cbr%3e报错,ecmall 标签以及格式化代码
  3. Arduino 笔记。开篇
  4. for-each 循环原理
  5. S/4HANA业务角色概览之订单到收款篇
  6. asp.net服务器端跳转页面的三种方法
  7. pkuseg-python的postag.zip在不能联网的服务器上的解决办法
  8. c语言栈的实现以及操作_python模拟栈的操作实现非递归方式的快速排序算法
  9. 计算机普通用户禁止修改c盘,保护C盘数据win7中设置禁止修改C盘文件的方法
  10. (1)c语言学习总结之从关键字到循环结构
  11. ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
  12. POJ 计算几何专项训练(2) 【1269】【1410】【1696】【3347】【2826】
  13. [NLP] 酒店名归类
  14. VC++字符串类型转换
  15. spotify电脑下载歌曲_我来简单说一下Apple Music和Spotify的下载方法
  16. 柔性整列压力传感器工作原理记录
  17. 基于Ogre1.9开发的3D场景编辑器
  18. 高仿微信上划取消录音
  19. 手把手实战 Redis 教学
  20. Android Studio虚拟机卸载步骤(特殊)

热门文章

  1. potato什么软件_张鹏都这么努力又出新项目美生在线,你还有什么资格不努力!?...
  2. 小程序毕业设计 基于微信课程预约报名小程序 毕业设计开题报告功能参考
  3. 最新英特尔CPU漏洞SWAPGS曝光,允许黑客访问内存敏感信息
  4. 安防监控防雷+防雷工程综合应用解决方案
  5. linux usb显卡驱动,基于Linux系统的USB显卡多用户平台开发
  6. window7安装oracle9i,win 7安装oracle11g企业版
  7. 知识图谱实战1:构建红楼梦人物知识图谱
  8. 知识点记录-abase是什么
  9. 2020.12.21-汇川电源软件工程师初面
  10. 4 设计计算器clac-Java