您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何集成AWTK到iotjs,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
iotjs 是三星開源的 javascript 物聯網開發平臺。它為 javascript 應用程序提供了訪問硬件、網絡、文件系統和異步化的能力,功能類似于 nodejs,但無論是代碼體積還是內存需求,iotjs 都要小很多,是用 javascript 開發 iot 設備應用程序的首選。
AWTK 全稱 Toolkit AnyWhere,是 ZLG 開發的開源 GUI 引擎,旨在為嵌入式系統、WEB、各種小程序、手機和 PC 打造的通用 GUI 引擎,為用戶提供一個功能強大、高效可靠、簡單易用、可輕松做出炫酷效果的 GUI 引擎。
用 C 語言來擴展 iotjs 不是太難的事情,但是將 GUI 集成到 iotjs 卻是有些麻煩的。主要原因在于 iotjs 有個主循環 (main loop),GUI 自己也有個主循環 (main loop),兩者不同并存,只能選一個。這里 AWTK 為例,介紹一下如何將 GUI 集成到 iotjs 中,這對將 GUI 集成到 nodejs 也是有參考價值。
在集成 AWTK 到 iotjs 時,我選擇了以 iotjs 的主循環為主。這并不是唯一的正確方案,做這個選擇的主要原因有:
讓 AWTK 作為 iotjs 的模塊,保持 iotjs 本身的開發方式。
避免修改 iotjs。iotjs 對我來說是第三方模塊,修改第三方模塊,會增加后期的維護成本。
我們把 AWTK 主循環的一次循環提取成一個 step,然后把它放到 iotjs 的定時器中,每隔 16 毫秒(最大 60FPS) 調用一次,這樣可以模擬 GUI 的主循環了。
const char* s_step_script = "\ (function() { \ var awtkStepId = 0;\ function awtkStep() {\ if(!awtk_main_loop_step()) {\ clearInterval(awtkStepId);\ console.log(\"awtk quit\");\ awtkStepId = 0;\ }\ }\ awtkStepId = setInterval(awtkStep, 16);\ }())"; JS_FUNCTION(wrap_awtk_main_loop_step) { bool_t ret = FALSE; main_loop_t* loop = main_loop(); if(loop != NULL) { main_loop_step(loop); ret = !(loop->app_quited); if(loop->app_quited) { tk_exit(); } } return jerry_create_number(ret); }
值得注意的是,這個定時器一定要放在 javascript 里去調用。 開始我用了 libuv 原生的定時器來實現,代碼簡潔而且高效,但是應用程序退出時,iotjs 就會崩掉,原因是 iotjs 認為所有的定時器都是 javascript 里的,而 javascripte 里的定時器是在原生定時器基礎上包裝而成,在應用程序退出時做了一些額外的釋放工作。
模態對話框會再次調用主循環的 run,直到對話框關閉。這個時候需要在 GUI 主循環中調用 iotjs 的主循環。但是 iotjs 的循環是 libuv 主循環的基礎上包裝了一層,而且不適合外面再次調用,所以我仿造 iotjs 實現了一個:
static ret_t main_loop_iotjs_run(main_loop_t* loop) { ret_t ret = RET_OK; iotjs_environment_t* env = iotjs_environment_get(); if (!iotjs_environment_is_exiting(env)) { bool more = 0; do { more = uv_run(iotjs_environment_loop(env), UV_RUN_ONCE); more |= iotjs_process_next_tick(); jerry_value_t ret_val = jerry_run_all_enqueued_jobs(); if (jerry_value_is_error(ret_val)) { ret_val = jerry_get_value_from_error(ret_val, true); iotjs_uncaught_exception(ret_val); jerry_release_value(ret_val); } if (more == false) { more = uv_loop_alive(iotjs_environment_loop(env)); } if(!(loop->running)) { break; } } while (more && !iotjs_environment_is_exiting(env)); } return ret;
!(loop->running) 表示模態對話框已經退出,可以回調上一級主循環了。
要將 GUI 集成到 iotjs,GUI 必須要把對外提供的 AIP 全部綁定到 jerryscript。這個對 AWTK 來說只是舉手之勞的事情,AWTK 通過提取注釋來生成 IDL,再根據 IDL 來生成各種語言的綁定,這讓綁定工作變得輕松,同時也降低了后期的維護成本。
AWTK-JS 這個項目提供了對 jerryscript 的綁定,我們把它編譯成一個庫,即可在 AWTK-iotjs 中使用了。
static int gui_app_start(int32_t lcd_w, int32_t lcd_h) { tk_init(lcd_w, lcd_h, APP_SIMULATOR, NULL, APP_ASSETS_ROOT); assets_init(); awtk_js_init(); main_loop()->running = TRUE; awtk_jerryscript_eval(AWTK_JS_FILE); tk_main_loop_run(); return 0; }
在啟動 GUI 時,調用 awtk_js_init 初始化 AWTK 的 jerryscript 綁定,調用 awtk_jerryscript_eval 預先加載 awtk.js 文件。
上述內容就是如何集成AWTK到iotjs,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。