Cocos Creator 教程:调用java/oc方法

由于游戏开发当中难免会进在原生平台中进行功能开发,比如开发微信的登陆/分享的功能。今天就总结下Cocos Creator 如何通过js代码来调用java/oc与回调js方法。

《Cocos Creator 教程:调用java/oc方法》

js直接调用原生方法

在Android平台上使用js直接调用Java方法与iOS和Mac上js直接调用Objective-C的方法都是如下格式:

var ojb = jsb.reflection.callStaticMethod(className, methodNmae, arg1, arg2, .....);

如果想进一步了解的话,请到官方查看。还有注意的事,该函数只能调用原生平台下的静态方法(也就是类方法)。

  • 调用java方法
    在callStaticMethod方法中,我们通过传入Java的类名方法名方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回值。
类名

参数中的类名必须是包含Java包路径的完整类名,例如我们在org.cocos2dx.javascript这个包下面写了一个Test类,那么这个Test类的完整类名应该是org/cocos2dx/javascript/Test

方法名

方法名很简单,就是方法本来的名字。例如Test类中写了一个add方法的名字就是add。

参数&返回值

最简单的方法签名是()V,它表示一个没有参数没有返回值的方法。其他一些例子:
(I)V表示参数为一个int,没有返回值的方法
(I)I表示参数为一个int,返回值为int的方法
(IF)Z表示参数为一个int和一个float,返回值为boolean的方法
目前Cocos2d-js中支持的Java类型签名有下面4种:

Java类型签名
intI
floatF
booleanZ
StringLjava/lang/String;

如果想进一步了解可以到官方文档查看。
:String的签名是Ljava/lang/String;不能缺少分号(;)。建议如果想传递一个对象,数组的话等大量数据的话。可是又没对应Object、Array的签名,可以使用JSON字符串来传递。想了解java中使用JSON进行数据传递点击这

  • 调用oc方法
    与Android上js调用Java一样,Cocos2d-JS也提供了在iOS和Mac上js直接调用Objective-C的方法
类名

参数中的类名,只需要传入OC中的类名即可,与Java不同,类名并不需要路径。比如你在工程底下新建一个类NativeOcClass,只要你将他引入工程,那么他的类名就是NativeOcClass,你并不需要传入它的路径。

方法名

方法名比较要需要注意,我们需要传入完整的方法名,特别是当某个方法带有参数的时候,你需要将方法的冒号:也带上。

参数&返回值

与java的格式又有所不同,只要直接写入参数就可以了,返回值如平常函数一般。

//在js中反射调用
var ret = jsb.reflection.callStaticMethod("NativeOcClass", 
                                               "callNativeUIWithTitle:andContent:", 
                                               "cocos2d-js", 
                                               "Yes! you call a Native UI from Reflection");
//函数的实现
 +(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content{
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:content delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
        [alertView show];
        return true;
    }

注意:在OC的实现中,如果方法的参数需要使用float、int、bool的,请使用如下类型进行转换:
float,int 请使用NSNumber类型,bool请使用BOOL类型。且参数和返回值支持 int, float, bool, string,其余的类型暂时不支持。

原生方法回调js

  • Android平台
    目前回调js的方法是用到了Cocos2dx库中的Cocos2dxJavascriptJavaBridge类中的唯一的静态方法evalString();输入参数是String类型。例如:
//cc.vv是挂在cc的一个对象,cc.vv.anysdkMgr是一某个脚本的实例。onShareResp是微信分享回调实例中方法。
Cocos2dxJavascriptJavaBridge.evalString("cc.vv.anysdkMgr.onShareResp()");
//如果回调带参数时,如微信登陆回调token。
Cocos2dxJavascriptJavaBridge.evalString("cc.vv.anysdkMgr.onLoginResp('"+ authResp.token +"')");

在1.8版本以后,请使用以下方式:

《Cocos Creator 教程:调用java/oc方法》 image.png

  • ios平台
    主要用到了ScriptingCore类,取到实例后,使用evalString()方法。例如:
ScriptingCore::getInstance()->evalString("cc.vv.anysdkMgr.onShareResp()");
//如果回调带参数时,如微信登陆回调token。
NSString *code = aresp.code;
char tmp[255]= {0};
const char* tcode = 

;
sprintf(tmp, "cc.vv.anysdkMgr.onLoginResp('%s')",tcode);
ScriptingCore::getInstance()->evalString(tmp);

在1.8以后的版本:

//引入头文件
#include "cocos/scripting/js-bindings/manual/ScriptingCore.h"
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h"

//使用
se::ScriptEngine* se = se::ScriptEngine::getInstance();
se->evalString("------");

cc.vv是Object,而cc.vv.anysdkMgr是cc.vv的属性,AnysdkMgr脚本实例。

最后

好了,今天就先总结到这里吧。

    原文作者:Leo501
    原文地址: https://www.jianshu.com/p/4fb034122fb3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞