CocosCreator在Android和iOS双平台的双向调用

2023-10-30

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

 

一、下面先写好CocosCreator调用原生端(iOS和Android):

 

CocosCreator代码:

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

/**

调用原生方法类

*/
window.test = window.test || {};

(function () {
    var CallNative = {};

    CallNative.test1 = function() {
        if (cc.sys.platform === cc.sys.ANDROID) {
            if (jsb != null && jsb != "undefined") {
                jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "test1", "()V");
            }
        } else if (cc.sys.os === cc.sys.OS_IOS) {
            jsb.reflection.callStaticMethod("CocosHelper", "test1");
        }
    }

    CallNative.test2 = function(parm1, parm2) {
        if (cc.sys.platform === cc.sys.ANDROID) {
            if (jsb != null && jsb != "undefined") {
                jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "test2", "(Ljava/lang/String;Ljava/lang/String;)V", parm1, parm2);
            }
        } else if (cc.sys.os === cc.sys.OS_IOS) {
            jsb.reflection.callStaticMethod("CocosHelper", "test2WithParm1:andParm2:", parm1, parm2);
        }
    }

    window.test.CallNative = CallNative;
})();

这个代码包括了两个函数,每个函数都在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。

//
//  CocostHelper.mm
//
//  Created by zhufu on 2019/8/16.
//

#import "MonetHelper.h"
#import "LeisureManager.h"

#import "cocos2d.h"
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h"
using namespace cocos2d;

@implementation MonetHelper


+ (instancetype)sharedSingleton {
    static MonetHelper *_sharedSingleton = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //不能再使用alloc方法
        //因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法
        _sharedSingleton = [[super allocWithZone:NULL] init];
        [_sharedSingleton initDelegate];
        [_sharedSingleton checkTransaction];
    });
    return _sharedSingleton;
}

+ (void)test1 {
    //以下是您想要开发的功能
}

+ (void)test2WithParm1:(NSString *)parm1 andParm2:(NSString *)parm2 {
    //以下是您想要开发的功能
}

- (void) callCocos {
    std::string jsCallStr;
    std::string testString1 =[@"testString1" UTF8String];
    std::string testString2 = [@"testString2" UTF8String];
    jsCallStr = cocos2d::StringUtils::format("receiveNative(\"%s\",\"%s\");", testString1.c_str(), testString2.c_str());
    se::Value *ret = new se::Value();
    se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str() , -1 , ret);
}

@end

以下是CocosHelper.h。

//
//  CocostHelper.h
//
//  Created by zhufu on 2019/8/16.
//

#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>
#import <StoreKit/StoreKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface MonetHelper : NSObject

+ (instancetype)sharedSingleton;

+ (void)test1;

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

- (void) callCocos;

@end

NS_ASSUME_NONNULL_END

我们要注意两个方法:

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

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

2、Android:

package org.cocos2dx.javascript;

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;

import android.os.Bundle;

import android.content.Intent;
import android.content.res.Configuration;
import android.util.Log;

public class AppActivity extends Cocos2dxActivity {

    public static String TAG = "AppActivity";

    public static AppActivity app = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Workaround in
        // https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        if (!isTaskRoot()) {
            // Android launched another instance of the root activity into an existing task
            // so just quietly finish and go away, dropping the user back into the activity
            // at the top of the stack (ie: the last state of this task)
            // Don't need to finish it again since it's finished in super.onCreate .
            return;
        }
        // DO OTHER INITIALIZATION BELOW
        SDKWrapper.getInstance().init(this);

        app = this;

    }

    //...
    public static void test1() {
        Log.i(TAG, "test1");
        //做您想要完成的功能。。。
    }

    //...
    public static void test2(String parm1, String parm2) {
        Log.i(TAG, "test2");
        //做您想要完成的功能。。。
    }

    public void callCocos() {
        app.runOnGLThread(new Runnable() {
            @Override
            public void run() {
                // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
                String test1 = "test1";
                String test2 = "test2";
                String script = String.format("receiveNative(%s,%s);", test1, test2);
                Cocos2dxJavascriptJavaBridge.evalString(script);
            }
        });
    }
}

 

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

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

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

而CocosCreator的话,也很简单:

//定义原生调用的方法

window.receiveNative = function() {
    //以下是完成您想要开发的功能。。。
    
}

 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CocosCreator在Android和iOS双平台的双向调用 的相关文章

随机推荐