zoukankan      html  css  js  c++  java
  • cocos2dx-jsb 跨语言调用及第三方集成

    1:C++中调用js方法:

    问题:ios中当用户通过home键将游戏转入后台时,调用js中的暂停游戏方法;

    AppDelegate::applicationDidEnterBackground() 和 applicationDidEnterForeground()方法是C++方式处理程序进入后台与前台的代码,在此处添加C++调用js的代码:

    //version 2.1.3
    ScriptingCore* sc = ScriptingCore::getInstance();
    jsval nsval;
    JS_GetProperty(sc->getGlobalContext(), sc->getGlobalObject(), "类名", &nsval);
    if(nsval != JSVAL_VOID)
    {
         sc->executeFunctionWithOwner(nsval,"方法名"); 
    }

    js中(假设类名plus,方法名:onDidEnterBackground):

    var plus = {};

    plus.onDidEnterBackground(){...//code here};

    备注:

    使用executeFunctionWithOwner的关键是获取Owner,JS_GetProperty是spideMonkey提供的一种获取属性(也是对象)的方式;

    =========================================================

    2:js中调用C++方法:

    定义C++方法,然后将编写绑定, 以在TableView下增加一个testjs方法为例, 我们在jsb_cocos2dx_extension_manual.cpp中添加代码:

    //add manual function to js
    static JSBool js_cocos2dx_CCTableView_testFuncTojs(JSContext* cx, uint32_t argc, jsval *vp)
    {
        if(argc > 0)
        {
            JSString *string = NULL;
            JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &string);
            if(string)
            {
                JSStringWrapper wrapper(string);
                CCLOG("jsb binding say: %s",wrapper.get().c_str());
            }
        }
        return JS_TRUE;
    }

      

     
    然后在register_all_cocos2dx_extenstion_manual(JSContext* cx, JSObject* global)末尾行添加一个定义:
     
    JS_DefineFunction(cx, tmpObj, "testFuncTojs", js_cocos2dx_CCTableView_testFuncTojs, 1, JSPROP_READONLY|JSPROP_PERMANENT);
     
    最后在js文件中即可调用:
     
    cc.TableView.testFuncTojs("hello , jsb!");
     

    =========================================================

    3:C++调用obj-C 

    定义oc的.h和.m文件,定义方法: testLog  和 testMessageBox

    定义c++的.h文件

    定义c++的cpp文件,将后缀名改为.mm

    .mm文件混编写法如下:

    #include "supportOC.h"
    #include "invokeOC.h"
     
    void invokeOC::myinit(){
        [supportOC testLog];
        [supportOC testMessageBox:@"cocos2d-x调用oc" title:@"hello"];
    }

      

    之后在主程序中引入c++的.h文件后即可使用 invokeOC::myinit()方法;

    =========================================================

    4:C++和 Java的互调

    制作安卓版本时,我们需要使用C++调用java的函数,这个通过jni实现,实例:

    在头部引入文件:

    #include <jni.h>

    #include "platform/android/jniHelper.h"

    然后定义C++方法:

    void callJavaFunc()
     
    {
     
      cocos2d::JniMethodInfo t;
     
      if(cocos2d::JniHelper::getStaticMethodInfo(t, "org/cocos2dx/项目名称/类名", "java的方法","()V"))
     
      {
     
        t.env->CallStaticVoidMethod(t.classID, t.methodID);
     
      }
     
    }

    在c++中调用callJavaFunc()方法或者绑定给js调用,然后使用NDK编译后在ADT中运行,即可调到java的方法;

    java调用C++的方法:

    首先在java中定义一个public static native void funcname(); 然后运行时会调用C++中一定命名规则的funcname函数;命名如下:

    复制代码
    extern "C" {
    
      void Java_org_cocos2dx_项目名_类名_funcname(JNIEnv *env, jobject thiz)
    
      {
    
        CCLog("jni : java call C++ ");
      }
    
    }
    复制代码

     注意这里一定要extern "C" , 不然java无法找到这个native方法;

    =========================================================

    4:关于 2.1.3 Plugin-X

     暂时未有空实现,附两篇好文:

    http://go3k.org/blog/2013/07/08/cocos2dx-pluginx-1/

    http://go3k.org/blog/2013/07/08/cocos2dx-pluginx-2/

    =========================================================

    5:参考:

    2.1.0版本手动绑定TableView过程:https://github.com/cocos2d/cocos2d-x/pull/2015/files

    调整C++源码;

    scripting/javascript/bindings/cocos2d_specifices.cpp中添加绑定代码;

    scripting/javascript/bindings/js/jsb_cocos2d.js中添加常量与扩展类; 

    tools/tojs/cocos2dx.ini 添加脚本生成的规则;

  • 相关阅读:
    Android开发 ViewConfiguration View的配置信息类
    Android 开发 倒计时功能 转载
    Android 开发 关于7.0 FileUriExposedException异常 详解
    Android 开发 实现文本搜索功能
    Android 开发 Activity里获取View的宽度和高度 转载
    Android 开发 存储目录的详解
    Android 开发 Fresco框架点击小图显示全屏大图实现 ZoomableDraweeView
    Android 开发 将window变暗
    Android 开发 DisplayMetrics获取Android设备的屏幕高宽与其他信息
    Android 开发 DP、PX、SP转换详解
  • 原文地址:https://www.cnblogs.com/zhepama/p/3302735.html
Copyright © 2011-2022 走看看