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

cocos2dx-jsb 跨语言调用及第三方集成 - 过程记录的更多相关文章

  1. vs2019 Com组件初探-简单的COM编写以及实现跨语言调用

    前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...

  2. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  3. Golang通过Thrift框架完美实现跨语言调用

    每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...

  4. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  5. 跨语言调用Hangfire定时作业服务

    跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...

  6. C++ 跨语言调用 Java

    C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...

  7. 使用thrift进行跨语言调用(php c# java)

    使用thrift进行跨语言调用(php c# java)   1:前言 实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端.其实除了本文提供的办法 ...

  8. Java跨语言调用,使用JNA访问Java外部接口

    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...

  9. CLS(公共语言规范)的CLSCompliant(跨语言调用)

    .net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace  ...

随机推荐

  1. Excel的 OleDb 连接串的格式

    Excel的 OleDb 连接串的格式(Provider=Microsoft.ACE.OLEDB)(2012-08-02 13:04:20) string strCon = "Provide ...

  2. BITED数学建模七日谈之五:怎样问数学模型问题

    下面进入数学建模经验谈第五天:怎样问数学模型问题 写这一篇的目的主要在于帮助大家能更快地发现问题和解决问题,让自己的模型思路有一个比较好的形成过程. 在我们学习数学模型.准备比赛的时候,经常会遇到各种 ...

  3. 40个超酷的jQuery动画效果教程

    自从出现,jQuery就在web领域就引起了轰动,现在它已经成为Web动画效果的最佳解决方案之一.jQuery提供了良好的交叉浏览器支持,并且轻便易用.现在,jQuery在定义和控制小型的Web动画诸 ...

  4. 分区表,桶表,外部表,以及hive一些命令行小工具

    hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...

  5. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  6. HDU 1847 Good Luck in CET-4 Everybody!(找规律,或者简单SG函数)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. 【下有对策】verycd没有的资源有很多方法下载

    由于国内专门从事假冒电驴官方欺骗中国人的verycd公司出品的冒牌官方电驴"阉割驴"目前已经阉割掉了搜索功能,请电驴爱好者们尽快更换正宗版电驴软件: 电骡--emule官方网站:h ...

  8. Maven Archetype Plugin

    使用Archetype的一般步骤 命令——mvn archetype:generate 输入命令后,Archetype插件会输出一个Archetype列表供用户选择:选择自己想要使用的Archetyp ...

  9. 使用logmnr方法找回被误删除Oracle的数据的脚本

    俗话说,常在河边走,哪有不湿鞋的.作为一个经常与数据库打交道的程序员,偶尔不小心误删除或误操作的数据也是在所难免的.如果是Oracle数据库,这里给您介绍一种从日志中找回数据的办法,下面这个地址是我以 ...

  10. zendstudio 出现failed to create the java machine转

    是因为配置java虚拟机内存太小 打开zend for eclipse 10.5时报了个错: failed to create the java virtual machine google了一下,解 ...