栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

android cocoscreator 相互调用(三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

android cocoscreator 相互调用(三)

前言
前2章 讲述了 android 调用 c++ so库,这边主要讲在android cocoscreator 中java 与js 相互调用;
1 准备
win7 64
androidstudio4.1.1 cocoscreator2.4.4
2 创建工程并修改
1> cocoscreator 创建个 helloworld 工程

2 > UI 界面如下

3> 增加个JavaCallJs.js

代码如下

const JavaCallJs = {
    getVau: function (datastr) {
        if (cc.game) {
            cc.game.labelstr = datastr;
        }
    }
}
module.exports = JavaCallJs;

4 > 修改HelloWord.js 如下

const JavaCallJs = require("JavaCallJs");
cc.Class({
    extends: cc.Component,

    properties: {
        label: {
            default: null,
            type: cc.Label
        },
        // defaults, set visually when attaching this script to the Canvas
        text: 'Hello, World!',

        inputfun:{
            default:null,
            type:cc.EditBox
        },

        inputparam:{
            default:null,
            type:cc.EditBox
        },

        inputrealparamcount:{
            default:null,
            type:cc.EditBox
        },

        inputrealparams:{
            default:null,
            type:cc.EditBox
        },

        button:{
            default:null,
            type:cc.Button
        },

        output:cc.Label

    },

    // use this for initialization
    onLoad: function () {
        this.label.string = this.text;
        
        
    },

    start:function(){
        if (cc.sys.isNative && jsb != null && jsb != "undefined") {
            this.output.string ="jsb function is vaild";
        }else{
            this.outputlog("jsb function is invaild");
        }

        if (!cc.game) {
            cc.game = {};
            cc.game.JavaCallJs = JavaCallJs;
            this.outputlog("cc.game.JavaCallJs set[1]");
        }else if (!cc.game.JavaCallJs){
            cc.game.JavaCallJs = JavaCallJs;
            this.outputlog("cc.game.JavaCallJs set[2]");
        }
    },

    // called every frame
    update: function (dt) {

    },

    //日志输出
    outputlog:function(){//可变参数  arguments
        if(cc.sys.isNative  &&  cc.sys.platform == cc.sys.OS_ANDROID){
            const  cAppActivity = "org/cocos2dx/javascript/AppActivity";
            let strlog="";
            for (var i=0; i 0  && self.inputrealparams.string.length > 0){
                                    let ss1 = realcountstr.split("|"); //字符串数组
                                    let ss2 = realparamstr.split("|"); //字符串数组
                                    this.outputlog("ss1.length=",ss1.length,"ss2.length=",ss2.length);
                                    if(ss1.length == ss2.length){
                                        for (let i=0;i 0){
                                    this.outputlog("realinput fun0",""+realinput[0]);
                                }
                                
                                let outputstr =  "";
                                const  cAppActivity = "org/cocos2dx/javascript/AppActivity";
                                if(rtnpm.indexOf("V") >= 0){
                                    //无返回参数
                                    this.outputlog("rtnpm",rtnpm,"无参数返回");
                                    switch(realinput.length){
                                        case 0:  jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr); break;
                                        case 1:  jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0]); break;
                                        case 2:  jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1]); break;
                                        case 3:  jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1],realinput[2]); break;
                                        case 4:  jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1],realinput[2],realinput[3]); break;
                                        case 5:  jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1],realinput[2],realinput[3],realinput[4]); break;     
                                        default:
                                            return       ;
                                    }
                                  //  jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity",inputfun.string,inputparam.string);
                                    outputstr = "no return params";
                                }else{
                                    //有返回参数
                                    this.outputlog("rtnpm",rtnpm,"有参数返回");
                                    let rtnv ;
                                    switch(realinput.length){
                                        case 0:  rtnv=jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr); break;
                                        case 1:  rtnv=jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0]); break;
                                        case 2:  rtnv=jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1]); break;
                                        case 3:  rtnv=jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1],realinput[2]); break;
                                        case 4:  rtnv=jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1],realinput[2],realinput[3]); break;
                                        case 5:  rtnv=jsb.reflection.callStaticMethod(cAppActivity,funstr,funparamstr,realinput[0],realinput[1],realinput[2],realinput[3],realinput[4]); break;     
                                        default:
                                            return  ;
                                    }

                                    this.outputlog("rtnpm",rtnpm,"有参数返回");
                                  // let rtnv =  jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity",inputfun.string,inputparam.string);
                                   if(isNaN(rtnv)){  //不是数字
                                        if(typeof(rtnv) == 'string'){ //字符串{
                                            outputstr =  rtnv ;
                                        }else if(typeof(rtnv) == 'object'){
                                            outputstr = JSON.stringify(rtnv) ;   //将对象转为字符串
                                            //JSON.parse(str);  符串转为对象 
                                        }else {
                                            outputstr = "return params is error";
                                        }
                                   } else {//是数字
                                    outputstr = ""+rtnv ;
                                   }
                                }
                                //加上时间 
                                let time = new Date();
                                self.output.string = time.toLocaleString() + " " + outputstr ;

                            }
                            

                        }
                       
                    }
                    
                 }
                 break;
                case "bjvcalljs":
                    self.showlable(cc.game.labelstr);
                    break; 
        }
    }
    ///
   
});


3 编译
1> 构建工程

2> 用AndroidStudio 打开 jsb-defaultframeworksruntime-srcproj.android-studio
修改AppActivity.java

代码如下:

package org.cocos2dx.javascript;

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;

import android.os.Bundle;

import android.content.Intent;
import android.content.res.Configuration;
import android.util.Log;

public class AppActivity extends Cocos2dxActivity {

    private static  AppActivity  _app = null ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Workaround in
        // https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        if (!isTaskRoot()) {
            // Android launched another instance of the root activity into an existing task
            // so just quietly finish and go away, dropping the user back into the activity
            // at the top of the stack (ie: the last state of this task)
            // Don't need to finish it again since it's finished in super.onCreate .
            return;
        }
        // DO OTHER INITIALIZATION BELOW
        SDKWrapper.getInstance().init(this);
        _app = this;
    }

    @Override
    public Cocos2dxGLSurfaceView onCreateView() {
        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
        // TestCpp should create stencil buffer
        glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
        SDKWrapper.getInstance().setGLSurfaceView(glSurfaceView, this);

        return glSurfaceView;
    }

    @Override
    protected void onResume() {
        super.onResume();
        SDKWrapper.getInstance().onResume();

    }

    @Override
    protected void onPause() {
        super.onPause();
        SDKWrapper.getInstance().onPause();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        if (!isTaskRoot()) {
            return;
        }

        SDKWrapper.getInstance().onDestroy();

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        SDKWrapper.getInstance().onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        SDKWrapper.getInstance().onNewIntent(intent);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        SDKWrapper.getInstance().onRestart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        SDKWrapper.getInstance().onStop();
    }

    @Override
    public void onBackPressed() {
        SDKWrapper.getInstance().onBackPressed();
        super.onBackPressed();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        SDKWrapper.getInstance().onConfigurationChanged(newConfig);
        super.onConfigurationChanged(newConfig);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        SDKWrapper.getInstance().onRestoreInstanceState(savedInstanceState);
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        SDKWrapper.getInstance().onSaveInstanceState(outState);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onStart() {
        SDKWrapper.getInstance().onStart();
        super.onStart();
    }

    
    public  static  int testfun1(int a,int b){
        return  a+b;
    }
    public static  void systemoutput(String strlog){

        System.out.println(strlog);
        Log.d("AppActivity", strlog);
    }

    public  static  void testfun2(int a){
        // AppActivity.this.test();
        _app.test(a);
    }

    public   void  test(final int a){
        //activity必须是继承自Cocos2dxActivity或者实现Cocos2dxHelperListener接口
        this.runOnGLThread(new Runnable() {
            @Override
            public void run(){
               
                String params = String.format("cc.game.JavaCallJs.getVau("%s")",String.valueOf(a*2));
                Cocos2dxJavascriptJavaBridge.evalString(params);
            }
        });
    }
}

4 测试
1:js call java

点击OK,结果正确,调用成功
1 > java call js

2 > 点击OK, js call java call js (js调用java函数,java函数里由调用js函数)
3> 点击bjvcalljs 查看结果

String params = String.format("cc.game.JavaCallJs.getVau("%s")",String.valueOf(a*2));
                Cocos2dxJavascriptJavaBridge.evalString(params);

5 js 与 java 调用完成
工程代码如有需要后续再上传

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号