由于感觉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的通话了。