CocosCreator 中 JS 與 Java 互相調用方式和註意事項
在 CocosCreator 下 JS 調用 Java/Objective-C 的格式都是:
var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)
JS 只能調用 Java 中的靜態方法,需要傳入類名、方法名、方法簽名、方法參數,並且可以獲得返回值。
類名
類名必須是包含 Java 包路徑的完整類名,而且用斜線 / 代替點 . ,例如 com.johnny.test.WxApiHelper 應該傳入 com/johnny/test/WxApiHelper 。
方法名
方法名很簡單,就是方法本來的名字。
方法簽名
方法簽名有點復雜,最簡單的方法簽名是 ()V ,它表示一個沒有參數也沒有返回值的方法。括號裏的符號表示參數類型,括號後面的符號表示返回值類型。因為 Java 是允許函數重載的,可以有多個方法名相同但是參數返回值不同的方法,方法簽名正是用來幫助區分這些相同名字的方法的。
目前 Cocos Creator 中支持的 Java 類型簽名有下面 4 種:
Java 類型 簽名
int I
float F
boolean Z
String Ljava/lang/String;
如果是其他類型的話,可以考慮轉換為 JSON 字符串。
參數
參數可以是 0 個或任意多個,直接使用 JS 中的 number,bool 和 string 就可以。
註意,如果 JS 調用 Java 過程中,需要更新 UI 元素,更新的部分代碼需要運行在 UI 線程中 Activity.runOnUiThread(Runnable) ,因為 JS 調用 Java 的過程不是運行在 UI 線程中的。
- Java 調用 JS 函數
有時候還需要在 Java 中回調 JS 函數,例如微信登錄成功後回調給 JS 函數,目前的方式是用 Cocos2dxJavascriptJavaBridge 的靜態方法 evalString() 。
// cc.wxcb 是掛在 cc 的一個對象
Cocos2dxJavascriptJavaBridge.evalString("cc.wxcb.onLoginResp(‘"+ authResp.token +"‘)");
但是需要註意的是 Java 回調 JS 時,一定要運行在 GL 線程中:
activity.runOnGLThread(new Runnable() {@Override
br/>@Override
Cocos2dxJavascriptJavaBridge.evalString("cc.wxcb.onLoginResp(‘"+ authResp.token +"‘)");
}
});
CocosCreator 中 JS 與 Java 互相調用方式和註意事項