说白了,就是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. golang range遍历是新创建对象还是创建对象的引用

    golang range遍历是新创建对象还是创建对象的引用,通俗的讲就是range对range出来的对象的修改会不会同步到被遍历的那个数组.先看如下代码: package main import ( ...

  2. SW:HTML DOM

    1:节点:nodeType,nodeValue,nodeName getAttributeNode() 方法从当前元素中通过名称获取属性节点. 元素节点nodeValue是null,属性节点nodeV ...

  3. mysql定时器设置开机默认自启动

    1).查询mysql安装位置:show variables like "%char%"; 2).查询定时器是否开启: -查询定时器状态:show VARIABLES LIKE '% ...

  4. OSL

    1,SimpleColorShader: shader gamma(color cin = color(,,),output color Cout=color(,,)) { Cout = cin; } ...

  5. CVE-2018-19386:SolarWinds数据库性能分析器中反射的XSS

    漏洞 在SolarWinds的11.1.457版中,"idcStateError.iwc"错误页面中存在Reflected Cross-Site Scripting漏洞,已经在版本 ...

  6. selenium模块

    一 介绍 二 安装 三 基本使用 四 选择器 五 等待元素被夹在 元素交互操作 其他 项目联 一 介绍 selenium最初是一个自动化测试的工具,而爬虫中使用它主要是为了解决requests无法直接 ...

  7. 用户态与内核态 & 文件流与文件描述符 简介【转】

    转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html 用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平 ...

  8. 正则表达式匹配日期,支持闰年,格式为YYYYMMDD

    年份:[\d]{4} 带31的月份:(0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])) 非2月不带31日的月份:((0[469])|11)((0[1-9])| ...

  9. nginx conf_ctx ****

    http://blog.chinaunix.net/uid-27767798-id-3840094.html 断断续续看完了,还是没有全部清晰

  10. Robot Framework学习笔记

    robot framework 上个用例的输出作为下个用例的输入 (Set Global Variable的用法) 注意:如果直接在suite里定义变量,变量在suite里的用例里只能应用,修改的效果 ...