【转】CocosCreator原生游戏js与oc/java互调

 

CocosCreator原生游戏js与oc/java互调

新项目需要在app游戏大厅中集成众多小游戏

仍然使用creator开发

然而若发布h5版本,用户首次加载时间相对较长

因此首批打算将游戏集成在app中,发布原生版本

这里总结一下ios原生版本开发过程中js与oc的互相调用方法

转载请标明原文地址:http://www.cnblogs.com/billyrun/articles/8529503.html

cocos creator和Objective-C互调用:

https://www.jianshu.com/p/1a6944fee132

https://www.jianshu.com/p/116826d2570c

https://forum.cocos.com/t/cocos-creator-oc-js/55764/2

cocos2d-js制作的游戏集成到原生app里的方法之iOS版

https://forum.cocos.com/t/cocos2d-js-app-ios/43803

Cocos2d 与OC的互相调用

https://blog.csdn.net/joker_wlk/article/details/53204026

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'

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以使用WebView中JavaScript与Android中Java方法互调。 想要实现这个功能,需要使用到Android中的WebView的addJavascriptInterface方法。这个方法可以将Java对象暴露给JavaScript代码,JavaScript代码就可以调用这个对象的方法,实现JavaJavaScript的互通。 具体步骤如下: 1. 在Java代码中创建一个类,这个类中包含需要暴露给JavaScript的方法。 2. 使用WebView的addJavascriptInterface方法将这个Java类对象暴露给JavaScript。 3. 在JavaScript代码中,使用window对象来访问这个Java对象,即可调用其中的方法。 具体的实现可以参考下面的代码示例: Java代码: ```java public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } ``` 在Activity中使用addJavascriptInterface方法将Java对象暴露给JavaScript: ```java WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android"); ``` JavaScript代码中通过window对象访问Java对象: ```javascript function showToast() { Android.showToast("Hello World!"); } ``` 注意,addJavascriptInterface方法需要在主线程中调用,否则可能会出现安全问题。另外,在使用JavaScript调用Java方法时,需要添加@JavascriptInterface注解,以确保安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值