java中JSB,Cocos Creator 利用JSB进行JS和Android相互调用
一.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相互调用相关推荐
- 前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...
Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得 < type="text/javascript"> < type="text/java ...
- cocos creator利用ShareSDK实现微信登录功能
首先在ShareSDK官网下载SDK或者在android studio中配置build.gradle. ShareSDK Maven集成文档 注:使用ShareSDK maven集成方式,不需要在An ...
- java与js交互,相互调用传参
随着前端技术的发展与H5的广泛使用,移动端采用native+h5的方式越来越多了,对于Android来说就涉及到java与js的交互,相互调用传参等.下面就来看一下java与js交互的简单demo. ...
- java 多个项目间事物_Java-web-多个独立项目之间相互调用实践
本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...
- java中你知道怎么利用hashSet去重吗?
一只IT界中的菜鸟,我立志做一只最菜的鸟 授人以鱼不如授人以渔 作为一个程序猿我们要有一个善于分析你所见到的产品,最起码你要知道让你做你能不能实现功能 话不多说进入主题 去重作用就是保证数据的唯一性, ...
- java中rhino什么用_使用require.js和Java / Rhino解析模块
小编典典 require.js在rhino上运行良好.最近,我在一个项目中使用了它. 您必须确保使用r.js(不是require.js),犀牛的require.js的修改版本. 您必须扩展Scrita ...
- python中如何解决类互相调用问题_python中同一个类,带参的方法直接如何相互调用...
我想在test_api1方法调用GetExecl时配置参数:(为了去掉循环语句,可以访问execl中指定行) def GetExecl(b1,self): testCaseFile = xlrd.op ...
- android中数据集成,移动数据终端 - 移动应用的集成-Android集成调用 | 快逸报表工具用户手册...
接口文件说明 Android提供的接口包对应的文件目录结构及相关的说明如下: 按照以上目录结果对文件进行拷贝后,需要对AndroidManifest.xml文件进行合并或拷贝: 对所有的的内容进行拷贝 ...
- java中怎么创建表格_Java中的表格怎么利用表格模型进行创建
Java中的表格怎么利用表格模型进行创建 发布时间:2020-12-03 16:44:43 来源:亿速云 阅读:89 作者:Leah 本篇文章给大家分享的是有关Java中的表格怎么利用表格模型进行创建 ...
最新文章
- 漫画:什么是 “设计模式” ?
- php方法中有%3cbr%3e报错,ecmall 标签以及格式化代码
- Arduino 笔记。开篇
- for-each 循环原理
- S/4HANA业务角色概览之订单到收款篇
- asp.net服务器端跳转页面的三种方法
- pkuseg-python的postag.zip在不能联网的服务器上的解决办法
- c语言栈的实现以及操作_python模拟栈的操作实现非递归方式的快速排序算法
- 计算机普通用户禁止修改c盘,保护C盘数据win7中设置禁止修改C盘文件的方法
- (1)c语言学习总结之从关键字到循环结构
- ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
- POJ 计算几何专项训练(2) 【1269】【1410】【1696】【3347】【2826】
- [NLP] 酒店名归类
- VC++字符串类型转换
- spotify电脑下载歌曲_我来简单说一下Apple Music和Spotify的下载方法
- 柔性整列压力传感器工作原理记录
- 基于Ogre1.9开发的3D场景编辑器
- 高仿微信上划取消录音
- 手把手实战 Redis 教学
- Android Studio虚拟机卸载步骤(特殊)
热门文章
- potato什么软件_张鹏都这么努力又出新项目美生在线,你还有什么资格不努力!?...
- 小程序毕业设计 基于微信课程预约报名小程序 毕业设计开题报告功能参考
- 最新英特尔CPU漏洞SWAPGS曝光,允许黑客访问内存敏感信息
- 安防监控防雷+防雷工程综合应用解决方案
- linux usb显卡驱动,基于Linux系统的USB显卡多用户平台开发
- window7安装oracle9i,win 7安装oracle11g企业版
- 知识图谱实战1:构建红楼梦人物知识图谱
- 知识点记录-abase是什么
- 2020.12.21-汇川电源软件工程师初面
- 4 设计计算器clac-Java