zoukankan      html  css  js  c++  java
  • cocos2dxjsb 跨语言调用及第三方集成 过程记录

    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 添加脚本生成的规则;

  • 相关阅读:
    C# 中的 ConfigurationManager类引用方法
    添加Word,Excel等dll时如何操作。
    Win7(64位)中IIS配置Access数据库的asp.net程序中出现“未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序”
    sql模糊查询
    Spring中AOP的使用
    MongoDB的孤儿文档是如何产生的
    Docker
    MySql索引优化
    Kafka(分布式流式系统)
    synchronized的底层实现
  • 原文地址:https://www.cnblogs.com/sslin/p/3022684.html
Copyright © 2011-2022 走看看