jsb调用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
#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 添加脚本生成的规则;
jsb调用java_cocos2dx-jsb 跨语言调用及第三方集成 - 过程记录相关推荐
- 使用thrift进行跨语言调用(php c# java)
1:前言 实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端.其实除了本文提供的办法还有其他办法,例如http+xml(json)等等都能做到. ...
- Java如何跨语言调用Python/R训练的模型
在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...
- 跨语言调用Hangfire定时作业服务
背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服务本身聚合在一个程序中运行,极大的限制了 ...
- Dubbo 跨语言调用神兽:dubbo-go-pixiu
简介:Pixiu 是基于 Dubbogo 的云原生.高性能.可扩展的微服务 API 网关.作为一款网关产品,Pixiu 帮助用户轻松创建.发布.维护.监控和保护任意规模的 API ,接受和处理成千上万 ...
- js php调用webservice,js跨域调用WebService的使用方法
这次给大家带来js跨域调用WebService的使用方法,js跨域调用WebService的注意事项有哪些,下面就是实战案例,一起来看一下. 步骤1. 在web.config中的system.web节 ...
- c如何调用java_JNI学习------C语言调用Java (转)
最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人可以得到解决. 在C/C++中调用Java的方法一般分为五个步骤:初始化虚拟机.获取类.获取类的方法.创建类对 ...
- EasyPlayerPro(Windows)流媒体播放器开发之跨语言调用
下面我们来讲解一下关于EasyPlayerPro接口的调用,主要分为C++和C#两种语言,C++也可以基于VC和QT进行开发,C++以VC MFC框架为例进行讲解,C#以Winform框架为例进行讲解 ...
- c语言调用python3_linux下c语言调用python方法问题
//c语言多线程调python,必须加上红色字体,因为python本身不是线程安全的 PyObject* callPython(char* cpModelPath) { if(cpModelPath ...
- html5d调用百度语音,易语言调用百度语音平台实现文字转换语音功能的代码
调用百度语音平台实现文字转换语音功能 此功能需要加载精易模块5.6 .版本 2 .支持库 wmp9 .程序集 窗口程序集1 .子程序 _试听按钮_被单击 播放器1.地址 = "http:// ...
最新文章
- 百度前端技术学院js任务三
- 无论什么级别程序员,“微服务架构”都是你必须过的坎!
- android 全屏动画,Android开发之全屏与非全屏的切换设置方法小结
- Hyper-V 2016:支持guest操作系统
- Linq之Lambda表达式初步认识
- git 常用的撤销操作
- 基于TensorFlow.js的JavaScript机器学习
- 拳打苹果 脚踢三星 国产品牌占据泰国手机市场超半数份额!
- 2021牛年春节海报PSD分层模板,简单一点就好!
- java通信方式_java 认知底层的五种通信方式
- dalsa相机设置编码器外触发_Modicon M262 编码器接口功能介绍
- ST-Link驱动安装包 STM32 keil
- 网管员常用工具(二)
- 利用opencv对图像进行二值化处理
- 来咯来咯~你想要的unity3d人物游戏模型素材都在这里
- 西门子g120变频器接线图_【直播】S71200与SINAMICS G120变频器的profinet通信
- 精准测试系列产品白皮书2020版
- Minecraft Mod 开发:目录
- python 编写正三角形,倒三角和菱形和各种镂空菱形
- 电脑桌面云便签软件怎么显示最小化按钮?