cocos2dx-jsb 跨语言调用及第三方集成 - 过程记录
1:C++中调用js方法:
问题:ios中当用户通过home键将游戏转入后台时,调用js中的暂停游戏方法;
AppDelegate::applicationDidEnterBackground() 和 applicationDidEnterForeground()方法是C++方式处理程序进入后台与前台的代码,在此处添加C++调用js的代码:
//version 2.1.3ScriptingCore* 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 jsstatic 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;} |
JS_DefineFunction(cx, tmpObj, "testFuncTojs", js_cocos2dx_CCTableView_testFuncTojs, 1, JSPROP_READONLY|JSPROP_PERMANENT); |
=========================================================
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 跨语言调用及第三方集成 - 过程记录的更多相关文章
- vs2019 Com组件初探-简单的COM编写以及实现跨语言调用
前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- Golang通过Thrift框架完美实现跨语言调用
每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- 跨语言调用Hangfire定时作业服务
跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...
- C++ 跨语言调用 Java
C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...
- 使用thrift进行跨语言调用(php c# java)
使用thrift进行跨语言调用(php c# java) 1:前言 实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端.其实除了本文提供的办法 ...
- Java跨语言调用,使用JNA访问Java外部接口
1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...
- CLS(公共语言规范)的CLSCompliant(跨语言调用)
.net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace ...
随机推荐
- 【C traps and pit falls】阅读笔记
已经是第几遍读C 陷阱与缺陷了,某种意义上,这不是一本常读常新的书,大概是因为读一遍过后就记住了. 一.编译器在将程序分解成符号的时候,使用的是大嘴法. 二.使用不对称边界有很多好处. 三.缓冲输出与 ...
- TopFreeTheme精选免费模板【20130827】
今天我们整理了一些关于WordPress, Joomla, Drupal, Magento, OpenCart的最新免费模板主题,绝大多数都是来自ThemeForest的响应式风格模板主题.题材多样化 ...
- Web服务器与Servlet容器
今日要闻: Oracle启动了JRE7到JRE8的自动更新, JRE8发布于2014.3,于2014.10成为java.com默认版本, JRE7发布于2011.7, Oracle指定的Java生命政 ...
- mysql 中时间和日期函数应用
一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +-------------------- ...
- Make the “Check out” function available in the office document opened with Document ID link
I found a solution to make the “Check out” function available in the office document opened with Doc ...
- Python和Django的Third Libraby分类汇总
这些第三方包与Python和Django一起构成了强大的生态系统,自己在开发时大大减小工作难度和工作量, 这些包基本上能满足我们的大部分需求.人与人的差距,其中一点是你知道的比他多,这样你就能大大提高 ...
- 個人最近做的最多的重複工作就是excel导出
//导出事件,这个是有合并动态列的 double num1 = 0, num2 = 0, num3 = 0; protected void btnExcel_Click(object sender, ...
- 信号量的操作——semop函数
信号量的值与相应资源的使用情况有关,当它的值大于 0 时,表示当前可用的资源数的数量:当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数.信号量的值仅能由 PV 操作来改变. 在 ...
- CentOS安装配置VSFTP服务器
{:toc} 前言 本文用最简单的方式创建FTP服务,即创建一个大家都可以访问的目录,没有涉及到各种权限限制. 创建目录 在安装配置ftp之前,首先创建一个目录,用来做ftp根目录.我创建的是/hom ...
- linux 分区与挂载
流程:分区-格式化-挂载 1.添加硬盘 使用fdisk -l命令查看磁盘状态 此处可以看到两块硬盘sda和sdb,第一块硬盘sda是装好系统的.sdb硬盘是未进行分区的. 本例将这个20G的硬盘分区, ...