博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx-jsb 跨语言调用及第三方集成 - 过程记录
阅读量:6935 次
发布时间:2019-06-27

本文共 2963 字,大约阅读时间需要 9 分钟。

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

转载地址:http://copjl.baihongyu.com/

你可能感兴趣的文章
Java并发基础03. 传统线程互斥技术—synchronized
查看>>
数据工厂模式,多种数据库选择 web.config 写法及相关操作
查看>>
ios面试题
查看>>
圣杯布局、双飞翼布局与flex布局实现
查看>>
控制条
查看>>
23种设计模式(一) 单例模式
查看>>
移动自动化相关名词解释
查看>>
testAPI
查看>>
delphi 7里怎么隐藏PageControl控件的tabsheet标签
查看>>
【自然语言处理篇】--以NLTK为基础讲解自然语⾔处理的原理和基础知识
查看>>
201771010126 王燕《面向对象程序设计(java)》第二周学习总结
查看>>
Git commit 信息标准和丢弃必须要的commit
查看>>
am335x Qt SocketCAN Demo hacking
查看>>
uva 10806
查看>>
Logback日志配置的简单使用
查看>>
html5-边框属性
查看>>
数据结构之最短路径(1) [迪杰斯特拉算法]
查看>>
日记 2016年8月9日(周二)
查看>>
java 协变返回
查看>>
java策略模式简单例程
查看>>