COCOSCREATOR在ANDROID和IOS双平台的双向调用

文章介绍了如何在CocosCreator中实现对Android和iOS原生代码的调用,包括无参数和带参数的方法调用,以及原生端如何通过`callCocos`方法回调到CocosCreator的JavaScript代码。示例代码展示了CocosCreator中的JavaScript接口和iOS及Android的原生实现。

COCOSCREATOR在ANDROID和IOS双平台的双向调用

标签: CocosCreator  iOS  Android  jsb

转载:https://www.freesion.com/article/7920683188/

参考:Java 原生反射机制 · Cocos Creator

由于感觉Cocos官方的文档写得有点不尽人意,所以在这里总结一下自己的经验。

一、下面先写好COCOSCREATOR调用原生端(IOS和ANDROID):

COCOSCREATOR代码:

我们新建一个javascript文件,命名为:CallNative.js。

 
  1. /**

  2. 调用原生方法类

  3. */

  4. window.test = window.test || {};

  5. (function () {

  6. var CallNative = {};

  7. CallNative.test1 = function() {

  8. if (cc.sys.platform === cc.sys.ANDROID) {

  9. if (jsb != null && jsb != "undefined") {

  10. jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "test1", "()V");

  11. }

  12. } else if (cc.sys.os === cc.sys.OS_IOS) {

  13. jsb.reflection.callStaticMethod("CocosHelper", "test1");

  14. }

  15. }

  16. CallNative.test2 = function(parm1, parm2) {

  17. if (cc.sys.platform === cc.sys.ANDROID) {

  18. if (jsb != null && jsb != "undefined") {

  19. jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "test2", "(Ljava/lang/String;Ljava/lang/String;)V", parm1, parm2);

  20. }

  21. } else if (cc.sys.os === cc.sys.OS_IOS) {

  22. jsb.reflection.callStaticMethod("CocosHelper", "test2WithParm1:andParm2:", parm1, parm2);

  23. }

  24. }

  25. window.test.CallNative = CallNative;

  26. })();

这个代码包括了两个函数,每个函数都在Android端和iOS端的调用功能。

第一个函数主要演示比较简单的没有参数的调用。

第二个函数主要演示有参数的调用。

在这里,我们要注意的有三点:

1、在以上代码中调用到的原生方法,不管iOS或Android端,都是要写静态方法,这个在写原生端功能的时候再详细说明。

2、在iOS端,要调用“testWithParam1:andParm2:”这个方法,该方法最后还有一个“:”;

如果只有一个参数的话,该方法应该修改为“testWitParam1:”或者"test1:",都可以,主要可以理解为有一个参数就要有一个“:”。

3、关于Andorid端参数的写法可以参数官方文档或者自行上网查阅JNI写法

原生端代码:

1、iOS:

我们在xcode中打开项目后,新建一个“Cocoa Touch Calss”:

    

命名为:CocosHelper,这样就会有CocosHelper.m和CocosHelper.h。

把CocosHelper.m重命名为Cocos.Helper.mm。

 
  1. //

  2. // CocostHelper.mm

  3. //

  4. // Created by zhufu on 2019/8/16.

  5. //

  6. #import "MonetHelper.h"

  7. #import "LeisureManager.h"

  8. #import "cocos2d.h"

  9. #include "cocos/scripting/js-bindings/jswrapper/SeApi.h"

  10. using namespace cocos2d;

  11. @implementation MonetHelper

  12. + (instancetype)sharedSingleton {

  13. static MonetHelper *_sharedSingleton = nil;

  14. static dispatch_once_t onceToken;

  15. dispatch_once(&onceToken, ^{

  16. //不能再使用alloc方法

  17. //因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法

  18. _sharedSingleton = [[super allocWithZone:NULL] init];

  19. [_sharedSingleton initDelegate];

  20. [_sharedSingleton checkTransaction];

  21. });

  22. return _sharedSingleton;

  23. }

  24. + (void)test1 {

  25. //以下是您想要开发的功能

  26. }

  27. + (void)test2WithParm1:(NSString *)parm1 andParm2:(NSString *)parm2 {

  28. //以下是您想要开发的功能

  29. }

  30. - (void) callCocos {

  31. std::string jsCallStr;

  32. std::string testString1 =[@"testString1" UTF8String];

  33. std::string testString2 = [@"testString2" UTF8String];

  34. jsCallStr = cocos2d::StringUtils::format("receiveNative(\"%s\",\"%s\");", testString1.c_str(), testString2.c_str());

  35. se::Value *ret = new se::Value();

  36. se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str() , -1 , ret);

  37. }

  38. @end

以下是CocosHelper.h。

 
  1. //

  2. // CocostHelper.h

  3. //

  4. // Created by zhufu on 2019/8/16.

  5. //

  6. #import <Foundation/Foundation.h>

  7. #import <GameKit/GameKit.h>

  8. #import <StoreKit/StoreKit.h>

  9. NS_ASSUME_NONNULL_BEGIN

  10. @interface MonetHelper : NSObject

  11. + (instancetype)sharedSingleton;

  12. + (void)test1;

  13. + (void)test2WithParm1:(NSString *)parm1 andParm2:(NSString *)parm2;

  14. - (void) callCocos;

  15. @end

  16. NS_ASSUME_NONNULL_END

我们要注意两个方法:

+(instancetype)shareSingleTon的静态方法:该方法把类设计为单例,让我们把调用-开头的方法(成员函数)。

-(void)callCocos方法:该方法可以再调回CocosCreator的javascript代码。

2、Android:

 
  1. package org.cocos2dx.javascript;

  2. import org.cocos2dx.lib.Cocos2dxActivity;

  3. import org.cocos2dx.lib.Cocos2dxGLSurfaceView;

  4. import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;

  5. import android.os.Bundle;

  6. import android.content.Intent;

  7. import android.content.res.Configuration;

  8. import android.util.Log;

  9. public class AppActivity extends Cocos2dxActivity {

  10. public static String TAG = "AppActivity";

  11. public static AppActivity app = null;

  12. @Override

  13. protected void onCreate(Bundle savedInstanceState) {

  14. super.onCreate(savedInstanceState);

  15. // Workaround in

  16. // https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508

  17. if (!isTaskRoot()) {

  18. // Android launched another instance of the root activity into an existing task

  19. // so just quietly finish and go away, dropping the user back into the activity

  20. // at the top of the stack (ie: the last state of this task)

  21. // Don't need to finish it again since it's finished in super.onCreate .

  22. return;

  23. }

  24. // DO OTHER INITIALIZATION BELOW

  25. SDKWrapper.getInstance().init(this);

  26. app = this;

  27. }

  28. //...

  29. public static void test1() {

  30. Log.i(TAG, "test1");

  31. //做您想要完成的功能。。。

  32. }

  33. //...

  34. public static void test2(String parm1, String parm2) {

  35. Log.i(TAG, "test2");

  36. //做您想要完成的功能。。。

  37. }

  38. public void callCocos() {

  39. app.runOnGLThread(new Runnable() {

  40. @Override

  41. public void run() {

  42. // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)

  43. String test1 = "test1";

  44. String test2 = "test2";

  45. String script = String.format("receiveNative(%s,%s);", test1, test2);

  46. Cocos2dxJavascriptJavaBridge.evalString(script);

  47. }

  48. });

  49. }

  50. }

二、写原生端调用COCOSCREATOR的代码:

这里也要分原生端代码和CocosCreator端代码:

原生端代码已经在上面写完了,就是callCocos这个方法。

而CocosCreator的话,也很简单:

 
  1. //定义原生调用的方法

  2. window.receiveNative = function() {

  3. //以下是完成您想要开发的功能。。。

  4. }

这样,我们就可以完成CocosCreator和Android与iOS的通话了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值