Cocos2d-js和Android交互
说白了,就是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交互的更多相关文章
- JS和Android交互
//本地webview写法 webview = (WebView) findViewById(R.id.webview); webview.loadUrl("http://192.168.1 ...
- 135、JS和Android交互范例
很简单的直接上代码 <uses-permission android:name="android.permission.INTERNET" /> assets/web. ...
- JS与Android交互
一.Android调用JS 2种方法 1.通过WebView的loadUrl 2.通过WebView的evaluateJavascript
- WebView之javascript与android交互基础加强
一.什么是js与android交互? 通俗一点就是使用js代码调用java代码,或者使用java代码调用js代码. 二.为什么要使用js与java代码交互? 1.可以做一些js网页做本身处理不了的事情 ...
- js和android及ios交互
Android中Java和JavaScript交互 这种交互,Hybrid App 会用的比较多一点, 本文将介绍如何实现Java代码和Javascript代码的相互调用. Android提供了一个很 ...
- js 与 ios Android交互
一.android 交互 1.js调用webview 在android API Level 17及以上的版本中,就会出现js调用不了android的代码,这是版本兼容的问题,需要在调用的方法上面加一个 ...
- android 与JS之间的交互
在页面布局很复杂并且是动态的时候,android本身的控件就变得不是那么地灵活了,只有借助于网页的强大布局能力才能实现,但是在操作html页面的同时也需要与android其它的组件存在交互,比如说 在 ...
- [转]JS调用Android里面的方法,Android调用JS里面的方法
FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...
- WebView之js调用Android类的方法传递数据
1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只 ...
随机推荐
- Ubuntu通过ADB连接手机
参考 ubuntu14.04 下android studio连接手机 安装 adb $sudo apt install adb $sudo lsusb 得到ID为 Bus Device : ID 12 ...
- Python文本编辑器推荐
首推当然是Sublime Text:可以中文化,百度上面有教程,页面比较酷炫,功能也不错 然后就是Notepad++,台湾开发,有中文界面
- ruban后台项目启动。进入断点
eclipse debug启动 进入断点显示-------------HikariPool-1 - Starting... 原因是 eclipse和tomcat的交互而产生的,在以debug模式启动t ...
- PostgreSQL学习笔记(二)-安装pgAdmin
继上篇安装PostgreSQL后,我们需要安装一个PostgreSQL的图形化管理工具. pgadmin管理工具 创建Python的虚拟环境 cd /root/venv python -m venv ...
- Mybatis 常用注解
Mybatis常用注解对应的目标和标签如表所示: 注解 目标 对应的XML标签 @CacheNamespace 类 <cache> @CacheNamespaceRef 类 <cac ...
- JQuery ajax 前后端传值介绍
https://jingyan.baidu.com/album/ca41422f0bf08e1eae99ed04.html?picindex=5 现在我们话不多说,开始仔细讲解一下我们ajax内部传递 ...
- python脚本--mysql数据库升级、备份
在公司经常要做测试环境的升级.备份.维护:升级后台的应用,不可避免要进行数据库的升级与备份,花了一个上午琢磨了一个脚本分享给大家. ToB的业务,在做环境维护的时候,有初始化环境和增量升级的环境,在测 ...
- django中常用的数据查询方法
https://blog.csdn.net/chen1042246612/article/details/84071006
- 算法工程师<编程题>
<编程题> 1.[Maximum Product Subarray 求最大子数组乘积] 这个求最大子数组乘积问题是由最大子数组之和问题演变而来,但是却比求最大子数组之和要复杂,因为在求和的 ...
- <!特别的一天>
<!DOCTYPE html> <html> <head> <meta charset="gb2312/"> <title&g ...