说白了,就是JavaScript和Java之间的函数互相调用。

先看一下效果

有了这个交互,为了以后接sdk做准备。

要点:

javascript调用java:

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

java调用javaScript:

Cocos2dxJavascriptJavaBridge.evalString("Global.mlayer.exit_cancle();"); // java to js

在这里我把这cocos2d-js的app.js  和 Android工程的AppActivity.java 的代码贴上,代码也有注释,纯干货,拿走就能用!

app.js:

var HelloWorldLayer = cc.Layer.extend({

	txt_info:null, 

	sprite:null,
ctor:function ()
{
//////////////////////////////
// 1. super init first
this._super(); /////////////////////////////
// 2. add a menu item with "X" image, which is clicked to quit the program
// you may modify it.
// ask the window size
var size = cc.winSize; var mainscene = ccs.load(res.MainScene_json);
this.addChild(mainscene.node); /* you can create scene with following comment code instead of using csb file.
/////////////////////////////
// 3. add your codes below...
// add a label shows "Hello World"
// create and initialize a label
var helloLabel = new cc.LabelTTF("Hello World", "Arial", 38);
// position the label on the center of the screen
helloLabel.x = size.width / 2;
helloLabel.y = size.height / 2 + 200;
// add the label as a child to this layer
this.addChild(helloLabel, 5); // add "HelloWorld" splash screen"
this.sprite = new cc.Sprite(res.HelloWorld_png);
this.sprite.attr({
x: size.width / 2,
y: size.height / 2
});
this.addChild(this.sprite, 0);
*/ //“测试传参”按钮
var btn_hello = ccui.helper.seekWidgetByName(mainscene.node, "Button_1");
btn_hello.addTouchEventListener(this.btn_hello_clicked,this); //"测试返回值" 按钮
var btn_testReturn = ccui.helper.seekWidgetByName(mainscene.node, "Button_2");
btn_testReturn.addTouchEventListener(this.btn_testReturn_clicked,this); //“测试对话框” 按钮
var btn_dialog = ccui.helper.seekWidgetByName(mainscene.node, "Button_3");
btn_dialog.addTouchEventListener(this.btn_dialog_clicked,this); //文本提示
this.txt_info = ccui.helper.seekWidgetByName(mainscene.node, "Text_1");
this.txt_info.setString("default"); return true;
}, //打开java层的对话框
btn_dialog_clicked:function(sender,type)
{
if(type == ccui.Widget.TOUCH_ENDED)
{
//弹出提示框 ok
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "showAlertDialog", "(Ljava/lang/String;Ljava/lang/String;)V", "提示","您确认要退出游戏?"); }
}, //测试 java函数的返回值
btn_testReturn_clicked:function(sender,type)
{
if(type == ccui.Widget.TOUCH_ENDED)
{
//测试返回值 ok
var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "sum", "(II)I", 3, 7);
cc.log("result"+result);
this.txt_info.setString("sum="+result);
}
}, btn_hello_clicked:function(sender,type){
//根据触发事件的类型进行分情况处理
switch (type)
{
case ccui.Widget.TOUCH_BEGAN:
//cc.log("btn_hello Touch Began"); break;
case ccui.Widget.TOUCH_MOVED:
//cc.log("btn_hello Touch Moved");
break;
case ccui.Widget.TOUCH_ENDED:
//cc.log("btn_hello Touch Ended");
cc.log("TODO call java");
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "hello", "(Ljava/lang/String;)V", "this is a message from js");
break;
case ccui.Widget.TOUCH_CANCELED:
//cc.log("btn_hello Touch Canceled");
break;
default:
break;
}
}, exit_sure:function()
{
this.txt_info.setString("确定");
}, exit_cancle:function()
{
this.txt_info.setString("取消");
}, }); var HelloWorldScene = cc.Scene.extend({
onEnter:function () {
this._super();
var layer = new HelloWorldLayer();
Global.mlayer = layer;//保存到全局变量
this.addChild(layer);
}
});

AppActivity.java:

/****************************************************************************
Copyright (c) 2008-2010 Ricardo Quesada
Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2011 Zynga Inc.
Copyright (c) 2013-2014 Chukong Technologies Inc. http://www.cocos2d-x.org Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package org.cocos2dx.javascript; import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView; import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.WindowManager;
import android.widget.Toast; import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge; // The name of .so is specified in AndroidMenifest.xml. NativityActivity will load it automatically for you.
// You can use "System.loadLibrary()" to load other .so files. public class AppActivity extends Cocos2dxActivity{ /*
* by joe
*/
private static AppActivity app = null;
//private static Context mContent = null; static String hostIPAdress = "0.0.0.0";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState); if(nativeIsLandScape()) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
if(nativeIsDebug()){
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
hostIPAdress = getHostIpAddress(); /**
* by joe
*/
app = this;
//mContent = this;
} @Override
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
// TestCpp should create stencil buffer
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8); return glSurfaceView;
} public String getHostIpAddress() {
WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
return ((ip & 0xFF) + "." + ((ip >>>= 8) & 0xFF) + "." + ((ip >>>= 8) & 0xFF) + "." + ((ip >>>= 8) & 0xFF));
} public static String getLocalIpAddress() {
return hostIPAdress;
} private static native boolean nativeIsLandScape();
private static native boolean nativeIsDebug(); //---------------以下是cocos2dx-js 与 java 交互-------------------------- /*
* 目前Cocos2d-js中支持的Java类型签名有下面4种
Java类型 签名
int I
float F
boolean Z
String Ljava/lang/String;
*/ /**
*
* jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "hello", "(Ljava/lang/String;)V", "this is a message from js");
* js->java
* 测试无返回值的
* @param msg
*/
public static void hello(final String msg){
System.out.println(msg); app.runOnUiThread(new Runnable() { @Override
public void run() { Toast.makeText(app, msg, Toast.LENGTH_SHORT).show();
}
}); } /**
*
* var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "sum", "(II)I", 3, 7);
* js->java
* 测试有返回值的
* @param a
* @param b
* @return
*/
public static int sum(int a, int b){
return a + b;
} /**
* 弹出一个对话框
* @param title
* @param message
*/
public static void showAlertDialog(final String title,final String message) { //这里一定要使用runOnUiThread
app.runOnUiThread(new Runnable() {
@Override
public void run() {
// 创建构建器
AlertDialog.Builder builder = new AlertDialog.Builder(app);
builder.setTitle(title)//提示
.setMessage(message)//您确认要退出游戏?
.setIcon(null)//.setIcon(R.drawable.icon)
.setPositiveButton("确定", new DialogInterface.OnClickListener(){ @Override
public void onClick(DialogInterface dialog, int which) { //System.out.println("是 clicked");
Toast.makeText(app, "确定", Toast.LENGTH_SHORT).show(); //跳出一个提示。
//Toast.makeText(mContent, "确定", Toast.LENGTH_SHORT).show(); //call cocos 函数 exit_sure
app.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("Global.mlayer.exit_sure();"); // java to js
}
}); }})
.setNegativeButton("取消", new DialogInterface.OnClickListener(){ @Override
public void onClick(DialogInterface dialog, int which) { //System.out.println("否 clicked");
Toast.makeText(app, "取消", Toast.LENGTH_SHORT).show(); //call cocos 函数 exit_cancle
app.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("Global.mlayer.exit_cancle();"); // java to js
}
}); }});
builder.create().show();
}
});
} /**
* java->js
* @param a
* @param b
*/
public static void callcocos(int a){ app.runOnGLThread(new Runnable() {
@Override
public void run() {
//test
// Cocos2dxJavascriptJavaBridge.evalString("SDKManage.javaToJSCall(\"a\", 5 , 7);"); // java to js
}
}); } }

Cocos2d-js和Android交互的更多相关文章

  1. JS和Android交互

    //本地webview写法 webview = (WebView) findViewById(R.id.webview); webview.loadUrl("http://192.168.1 ...

  2. 135、JS和Android交互范例

    很简单的直接上代码 <uses-permission android:name="android.permission.INTERNET" /> assets/web. ...

  3. JS与Android交互

    一.Android调用JS 2种方法 1.通过WebView的loadUrl 2.通过WebView的evaluateJavascript

  4. WebView之javascript与android交互基础加强

    一.什么是js与android交互? 通俗一点就是使用js代码调用java代码,或者使用java代码调用js代码. 二.为什么要使用js与java代码交互? 1.可以做一些js网页做本身处理不了的事情 ...

  5. js和android及ios交互

    Android中Java和JavaScript交互 这种交互,Hybrid App 会用的比较多一点, 本文将介绍如何实现Java代码和Javascript代码的相互调用. Android提供了一个很 ...

  6. js 与 ios Android交互

    一.android 交互 1.js调用webview 在android API Level 17及以上的版本中,就会出现js调用不了android的代码,这是版本兼容的问题,需要在调用的方法上面加一个 ...

  7. android 与JS之间的交互

    在页面布局很复杂并且是动态的时候,android本身的控件就变得不是那么地灵活了,只有借助于网页的强大布局能力才能实现,但是在操作html页面的同时也需要与android其它的组件存在交互,比如说 在 ...

  8. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  9. WebView之js调用Android类的方法传递数据

    1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只 ...

随机推荐

  1. luogu P5324 [BJOI2019]删数

    传送门 不如先考虑暴力,能删的序列首先有\(1,2,3...n\),还有就是升序排序后从后往前放数,第\(i\)位要么放\(i\),要么放\(i+1\)位置的数,例如\(1,2,4,4,5,6,9,9 ...

  2. git下载/上传文件提示:git did not exit cleanly

    问题:git操作下载/上传文件,提示信息如下 TortoiseGit-git did not exit cleanly (exit code 1) TortoiseGit-git did not ex ...

  3. Win8 64位安装Oracle 11g时错

    Win8 64位 安装Oracle时会出现[INS-13001] 环境不满足最低要求 异常原因 11.2.0.1 比Win8 早发行,所以 兼容列表不可能兼容 Win 8. 解决方法一 以管理员身份 ...

  4. 「JavaScript面向对象编程指南」基础

    DOM标准是独立的(即并不依赖JS)操作结构化文档的方式 BOM实际是个与浏览器有关的对象集合,原来没任何标准可言,H5诞生后才被定义了一些浏览器间通用的对象标准 ES5严格模式"use s ...

  5. 使用docker中mysql镜像

    1.拉取mysql镜像 docker pull mysql:5.6 2.运行mysql的镜像生成一个正在运行的容器,可以通过docker contain ls得到容器的id信息 docker run ...

  6. linux的cron

    linux系统由cron(crond)这个系统服务来控制的,linux系统上原来有非常多的计划性工作,因此,这个系统服务是默认启动的.cron进程每分钟会定期检查是否有要执行的任务,如果有就自动执行该 ...

  7. vue中数据添加完成以后,数据回显

    1.格式 <FormItem label="奖品领取类型:" prop="getType" > <RadioGroup v-model=&qu ...

  8. cocos2dx-lua调用C++

    文参考:https://www.cnblogs.com/xiaonanxia/p/4987856.html 上面的文章是IOS版教程,用4部分说明原理,1部分说操作步骤. 这里用window VS20 ...

  9. 高可用Redis(十):Redis原生命令搭建集群

    1.搭建Redis Cluster主要步骤 1.配置开启节点 2.meet 3.指派槽 4.主从关系分配 2.环境说明 两台虚拟机,IP地址分别为:192.168.81.100和192.168.81. ...

  10. python中hasattr()、getattr()、setattr()函数的使用

    1. hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法:有则返回True,没有则返回False:需要注意的是n ...