cocos creator 游戲在發布到android/ios等平臺時,難免要與本地原生平臺互相呼叫,
官方為我們提供了Java 原生反射機制和Objective-C 原生反射機制,以android的Java平臺為例
cocos creator 運行時呼叫android原生環境
var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)
android原生環境呼叫cocos creator運行時
Cocos2dxJavascriptJavaBridge.evalString("cc.log(\"Javascript Java bridge!\")");
在實際的開發中這兩種通訊機制往往是一一對應的,就像HTTP環境中發起一個request必然對應一個response,而這兩個介面幾乎是無狀態的,尤其是java層發起的連回傳值都沒有,
舉個例子axios是前端和nodejs環境非常流行的http封裝
// 發起請求request
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
//回傳 response
})
.catch(function (error) {
console.log(error);
//錯誤捕捉
})
如果CocosCreator環境也可以這樣使用就舒服多了,
事實上它也的確提供了JSB的方式實作這一需求,CocosCreator參考了騰訊在線教育部技術博客,對此有一個詳細的描述,總之通過這種方式CocosCreator運行時
就能用回掉函式作為引數來滿足這一需求,
jsb.fileDownloader.requestDownload(url, savePath, cookies, options, (success, url, savePath, msg, code) => {
// do whatever you want
});
如果這就完了,我也就不用寫這篇博文來補充了,
JSB是CocosCreator的JavaScript運行時和native C++ 環境通訊的解決方案,而我的需求可能只是在CocosCreator 運行時發起一個視頻激勵廣告,視頻播放完畢后再通知CocosCreator運行時視頻播放完畢,可以給予玩家獎勵啦,那么JSB的方案未免過于復雜了,
cocos runtime <---JSB--> Nitive C++ <--JNI--> android runtime
實際上HTTP的Request和Response本身也是相互獨立且異步的,讓它們能一一對應是因為在發起request的時候添加了標示ID并記錄在快取佇列,再異步回傳Response時帶上這個標示ID用于在快取佇列中尋找自己對應的Request背景關系,我們這里借鑒HTTP協議的方式讓Cocos運行時與本地代碼雙向通訊時可以一一對應,
// Cococs Creator 環境使用
Platform.watch_video(_=>{
// 回呼函式A,激勵視頻播放完畢時執行,諸如音樂恢復,加金幣或再玩一局
})
//Platform.ts
export default class Platform {
private static _callbackMaps: { [key: string]: any } = {}; //回掉快取
private static _callbackId = 0; //用于回掉標示的ID
static watch_video(callback, target?) {
console.log("######開始看視頻")
if (cc.sys.WECHAT_GAME == cc.sys.platform) {
} else if (cc.sys.isNative && cc.sys.ANDROID == cc.sys.platform) {
cc.audioEngine.pauseMusic(); //暫停音樂
let cid = this._callbackId++; //自增標示ID區別每一次呼叫
//組織回呼背景關系,并加入快取陣列
let callbackContext = {
callback: callback,
target: target,
callbackId: cid.toString()
}
this._callbackMaps[cid] = callbackContext;
//呼叫android本地代碼,并把cid作為引數,
var o = jsb.reflection.callStaticMethod('com/jmylab/kittenbal/AdManage', 'showAdVideo', '(Ljava/lang/String;)V', cid);
} else {
callback && callback.call(target)
}
}
//提供給android和ios應用層呼叫的介面
static onNativeCall(state, callbackId) {
//清除快取
let callbackContext =null;
if (this._callbackMaps.hasOwnProperty(callbackId)) {
callbackContext = this._callbackMaps[callbackId];
delete this._callbackMaps[callbackId];
}
if (state == 'reward') {
//給予獎勵,執行回掉函式A
callbackContext.callback && callbackContext.callback.call(callbackContext.target);
} else if (state == 'close') {
Toast.make("必須看完視頻,才能獲取獎勵")
} else if (state == 'failed') {
Toast.make("failed ")
}
}
}
//掛在window物件,方便本地代碼呼叫
window['Platform'] = Platform;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/99490.html
標籤:其他
上一篇:android記憶體泄漏
