由於遊戲開發當中難免會進在原生平臺中進行功能開發,比如開發微信的登陸/分享的功能。今天就總結下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版本以後,請使用以下方式:
- 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腳本實例。
最後
好了,今天就先總結到這裏吧。