新项目需要在app游戏大厅中集成众多小游戏
仍然使用creator开发
然而若发布h5版本,用户首次加载时间相对较长
因此首批打算将游戏集成在app中,发布原生版本
这里总结一下ios原生版本开发过程中js与oc的互相调用方法
转载请标明原文地址:http://www.cnblogs.com/billyrun/articles/8529503.html
js调用oc
参考官方文档Objective-C 原生反射机制
在ios工程中声明定义一个静态方法供js调用
在.h文件中声明函数showAd
#import <UIKit/UIKit.h> @class RootViewController; @interface AppController : NSObject <UIApplicationDelegate> { } +(NSString *)showAd:(NSString *)str title:(NSString *)tit; @property(nonatomic, readonly) RootViewController* viewController; @end
在.mm文件中定义如下
+(NSString *)showAd:(NSString *)str title:(NSString *)tit{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:tit message:str delegate:nil cancelButtonTitle:@"否" otherButtonTitles:@"是", nil]; [alertView show]; return @"hehe"; }
在js脚本中调用方式如下
if (cc.sys.isNative&&cc.sys.os==cc.sys.OS_IOS) { let ret = jsb.reflection.callStaticMethod("AppController","showAd:title:","title","message"); cc.log(ret)//打印输出:hehe }
调用后oc代码展示了弹框,并显示了传入参数
js代码打印了调用返回值
oc调用js
在js中定义一个全局函数供oc调用
window.testMethod = (str)=>{ cc.log('window.testMethod' , str) return 'abcd' }
oc代码调用方式如下
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h" using namespace cocos2d; @implementation AppController @synthesize window; #pragma mark - #pragma mark Application lifecycle // cocos2d application instance static AppDelegate* s_sharedApplication = nullptr; +(NSString *)showAd:(NSString *)str title:(NSString *)tit{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:tit message:str delegate:nil cancelButtonTitle:@"否" otherButtonTitles:@"是", nil]; [alertView show]; // call the js function std::string strRet = "haha"; std::string jsCallStr = cocos2d::StringUtils::format("testMethod(\"%s\");", strRet.c_str()); se::Value *ret = new se::Value(); se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str() , -1 , ret); NSLog(@"jsCallStr rtn = %s", ret->toString().c_str()); ////////////////// return @"hehe"; }
这里修改了showAd方法,增加call the js function相关部分
注意首先引入了SeApi.h文件,从而可以访问命名空间se::
然后构建语句字符串,调用testMethod方法并传入参数
再由ScriptEngine执行
可以看到js代码打印了参数haha
oc代码打印了返回值abcd
js调用java
场景中摆放一个label
点击label调用java中的方法(传入参数),并在label显示该方法的返回结果(字符串)
js代码如下
this.testlabel.node.on('touchend' , ()=>{ var rtn = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "show", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", "title", "message"); this.testlabel.string = rtn })
java代码中,找到cocoscreator发布安卓工程所生成的AppActivity.java文件
并添加show方法如下
public static String show(String title, String message) { return title + "--" + message; }
以上运行时,点击label后更新显示了'title--message'
参考文献
http://blog.csdn.net/hyczwl/article/details/51461797
http://blog.csdn.net/potato47/article/details/68954272
QQ:393422044
Email:fkrfkrfkr@163.com