关于CocosCreator代码的跨平台调用(OC\JAVA\JS)

因工作需接入不同sdk,涉及不同平台间相互调用,本文记录Java与JavaScript、OC与JavaScript的相互调用方法。介绍了在android平台js调用Java静态方法,包括类名、方法名、参数及返回值的写法,还提及Java调用js代码注意事项,以及iOS和Mac上js与OC的相互调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近的工作开始要接入不同的sdk,类似支付宝和微信的接入,所以需要接触到不同的平台间的相互调用,例如Java和JavaScript、OC和JavaScript。
接下来看一下我最近总结的方法,其实网上都有,这里只是给自己加深印象做的记录。

1.Java与JavaScript的相互调用

1.使用cocos2d-js 3.0以上版本中的一个新特性,在android平台上可以通过反射直接在js中调用java的静态方法,所以js可以直接这样写调用Java方法:
调用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进行数据传递点击这

jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "requestLogin", "(Ljava/lang/String;)V", strPlatform);

2.Java调用js代码需要注意的是:
引入两个库

import org.cocos2dx.lib.Cocos2dxHelper;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;

实现方法

Cocos2dxHelper.runOnGLThread(new Runnable() {
    @Override
    public void run() {
        Cocos2dxJavascriptJavaBridge.evalString("window.onresult(\"full_platform_pay_msg\",\""+ jsonObj.toString() +"\");");
    }
});

以上是1.8版本之后的写法,1.8之前直接这样写:

Cocos2dxJavascriptJavaBridge.evalString("window.onresult(\"full_platform_pay_msg\",\""+ jsonObj.toString() +"\");");

1.OC与JavaScript的相互调用

1.JavaScript调用OC
调用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;
    }

2.OC调用JavaScript

1.8之前

ScriptingCore::getInstance()->evalString("cc.vv.anysdkMgr.onShareResp()");
//如果回调带参数时,如微信登陆回调token。
NSString *code = aresp.code;
char tmp[255]= {0};
const char* tcode = [code UTF8String];
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("------");

https://www.jianshu.com/p/4fb034122fb3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值