Cocos Creator 教程:調用java/oc方法

由於遊戲開發當中難免會進在原生平臺中進行功能開發,比如開發微信的登陸/分享的功能。今天就總結下Cocos Creator 如何通過js代碼來調用java/oc與回調js方法。

js直接調用原生方法

在Android平臺上使用js直接調用Java方法與iOS和Mac上js直接調用Objective-C的方法都是如下格式:

var ojb = jsb.reflection.callStaticMethod(className, methodNmae, arg1, arg2, .....);

如果想進一步瞭解的話,請到官方查看。還有注意的事,該函數只能調用原生平臺下的靜態方法(也就是類方法)。

  • 調用java方法
    在callStaticMethod方法中,我們通過傳入Java的類名方法名方法簽名,參數就可以直接調用Java的靜態方法,並且可以獲得Java方法的返回值。
類名

參數中的類名必須是包含Java包路徑的完整類名,例如我們在org.cocos2dx.javascript這個包下面寫了一個Test類,那麼這個Test類的完整類名應該是org/cocos2dx/javascript/Test

方法名

方法名很簡單,就是方法本來的名字。例如Test類中寫了一個add方法的名字就是add。

參數&返回值

最簡單的方法簽名是**()V**,它表示一個沒有參數沒有返回值的方法。其他一些例子:
(I)V表示參數爲一個int,沒有返回值的方法
(I)I表示參數爲一個int,返回值爲int的方法
(IF)Z表示參數爲一個int和一個float,返回值爲boolean的方法
目前Cocos2d-js中支持的Java類型簽名有下面4種:

Java類型 簽名
int I
float F
boolean Z
String Ljava/lang/String;

如果想進一步瞭解可以到官方文檔查看。
:String的簽名是**Ljava/lang/String;**不能缺少分號(;)。建議如果想傳遞一個對象,數組的話等大量數據的話。可是又沒對應Object、Array的簽名,可以使用JSON字符串來傳遞。想了解java中使用JSON進行數據傳遞點擊這

  • 調用oc方法
    與Android上js調用Java一樣,Cocos2d-JS也提供了在iOS和Mac上js直接調用Objective-C的方法
類名

參數中的類名,只需要傳入OC中的類名即可,與Java不同,類名並不需要路徑。比如你在工程底下新建一個類NativeOcClass,只要你將他引入工程,那麼他的類名就是NativeOcClass,你並不需要傳入它的路徑。

方法名

方法名比較要需要注意,我們需要傳入完整的方法名,特別是當某個方法帶有參數的時候,你需要將方法的冒號**😗*也帶上。

參數&返回值

與java的格式又有所不同,只要直接寫入參數就可以了,返回值如平常函數一般。

//在js中反射調用
var ret = jsb.reflection.callStaticMethod("NativeOcClass", 
                                               "callNativeUIWithTitle:andContent:", 
                                               "cocos2d-js", 
                                               "Yes! you call a Native UI from Reflection");
//函數的實現
 +(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content{
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:content delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
        [alertView show];
        return true;
    }

注意:在OC的實現中,如果方法的參數需要使用float、int、bool的,請使用如下類型進行轉換:
float,int 請使用NSNumber類型,bool請使用BOOL類型。且參數和返回值支持 int, float, bool, string,其餘的類型暫時不支持。

原生方法回調js

  • Android平臺
    目前回調js的方法是用到了Cocos2dx庫中的Cocos2dxJavascriptJavaBridge類中的唯一的靜態方法evalString();輸入參數是String類型。例如:
//cc.vv是掛在cc的一個對象,cc.vv.anysdkMgr是一某個腳本的實例。onShareResp是微信分享回調實例中方法。
Cocos2dxJavascriptJavaBridge.evalString("cc.vv.anysdkMgr.onShareResp()");
//如果回調帶參數時,如微信登陸回調token。
Cocos2dxJavascriptJavaBridge.evalString("cc.vv.anysdkMgr.onLoginResp('"+ authResp.token +"')");

在1.8版本以後,請使用以下方式:
image.png

  • ios平臺
    主要用到了ScriptingCore類,取到實例後,使用evalString()方法。例如:
ScriptingCore::getInstance()->evalString("cc.vv.anysdkMgr.onShareResp()");
//如果回調帶參數時,如微信登陸回調token。
NSString *code = aresp.code;
char tmp[255]= {0};
const char* tcode = [code UTF8String];
sprintf(tmp, "cc.vv.anysdkMgr.onLoginResp('%s')",tcode);
ScriptingCore::getInstance()->evalString(tmp);

在1.8以後的版本:

//引入頭文件
#include "cocos/scripting/js-bindings/manual/ScriptingCore.h"
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h"

//使用
se::ScriptEngine* se = se::ScriptEngine::getInstance();
se->evalString("------");

cc.vv是Object,而cc.vv.anysdkMgr是cc.vv的屬性,AnysdkMgr腳本實例。

最後

好了,今天就先總結到這裏吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章