COCOSCREATOR在ANDROID和IOS双平台的双向调用
标签: CocosCreator iOS Android jsb
转载:https://www.freesion.com/article/7920683188/
参考:Java 原生反射机制 · Cocos Creator
由于感觉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的通话了。
文章介绍了如何在CocosCreator中实现对Android和iOS原生代码的调用,包括无参数和带参数的方法调用,以及原生端如何通过`callCocos`方法回调到CocosCreator的JavaScript代码。示例代码展示了CocosCreator中的JavaScript接口和iOS及Android的原生实现。
381

被折叠的 条评论
为什么被折叠?



