cocos2dx-jsb 跨语言调用
来源:互联网 发布:linux怎么运行sh脚本 编辑:程序博客网 时间:2024/04/20 13:12
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方法;
=========================================================
问题: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方法;
=========================================================
0 0
- cocos2dx-jsb 跨语言调用
- cocos2dx-jsb 跨语言调用
- cocos2dx-jsb 跨语言调用
- cocos2dx-jsb 跨语言调用
- cocos2dx-jsb 跨语言调用及第三方集成 - 过程记录
- cocos2dx js调用Ojbect c, 回调函数修改jsb.reflection.callStaticMethod
- 更新(2014-2-13)cocos2dx 3.0 beta2 JSB 绑定
- Cocos2dx-jsb 3.x 精灵构建过程浅析:
- Cocos2dx-jsb 3.x 精灵构建过程浅析(2):
- Cocos2dx 3.X jsb加载JavaScript源码文件分析
- Cocos2dx-jsb 中Node的onEnter过程分析(1)
- Cocos2dx-jsb 中Node的onEnter过程分析(2):
- jsb cocos2dx 绑定过程中遇到的问题
- Cocos2dx--Cocos2dx与Android平台的跨平台调用
- 关于jsb中js与c++的相互调用
- Cocos2d-js 3.0 jsb环境调用底层Objective-C代码
- cocos2d-js | JSB 调用Java函数 | Android设备ID
- cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsb
- zeromq
- xml、properties配置文件的读取
- 分治法,循环赛日程表
- jquery学习心得,常用的操作
- android JNI学习六
- cocos2dx-jsb 跨语言调用
- notepad++6.5中文绿色汉化版下载
- PB9核心之——数据窗口对象使用
- opencv基本操作
- Java判断给定日期哪个大,哪个小;日期类型:YYYY-MM-DD
- MTK android 可修改IMEI方法
- 多线程发送操作之一:运行一个线程的格式化代码(Specifying the Code to Run on a Thread)
- Java.util.Timer深入JDK代码及工作原理
- makefile $(filter PATTERN...,TEXT)