為 iotjs 開發原生子產品
iotjs 是三星開源的 javascript 物聯網開發平台。它為 javascript 應用程式提供了通路硬體、網絡、檔案系統和異步化的能力,功能類似于 nodejs,但無論是代碼體積還是記憶體需求,iotjs 都要小很多,是用 javascript 開發 iot 裝置應用程式的首選。
AWTK 全稱 Toolkit AnyWhere,是 ZLG 開發的開源 GUI 引擎,旨在為嵌入式系統、WEB、各種小程式、手機和 PC 打造的通用 GUI 引擎,為使用者提供一個功能強大、高效可靠、簡單易用、可輕松做出炫酷效果的 GUI 引擎。
為 iotjs 開發原生子產品,這篇 官方的文檔 是必須要讀的,裡面使用的 mymodule 例子是可以用的。在內建 AWTK 到 iotjs 時,也需要寫一個原生子產品,實際情況與例子差别很大,遇到幾個坑,折騰了大半天時間。這裡記個筆記,供有需要的朋友參考。
一、修改子產品的名稱
如果子產品的名稱使用 mymodule 是沒有問題的,但是 mymodule 是一個無意義的名稱,無法表達實際子產品的真實功能。我這裡需要把子產品改名為 awtk,可以按下列方式來做:
- 目錄名使用 awtk-module
mkdir awtk-module
- 将 C 代碼的源檔案改名為 awtk_module.c,并将初始化函數改名 InitAwtkNativeModule。
- 建立 awtk-module/modules.json
{
"modules": {
"awtk": {
"native_files": ["awtk_module.c"],
"init": "InitAwtkNativeModule",
"external_libs":["awtk-jerryscript", "jerryscript", "awtk", "assets", "glad", "gpinyin", "linebreak", "nanovg"],
"platforms": {
"linux": {
"external_libs":["SDL2", "gtk-3", "gdk-3", "sndio", "Xext", "X11", "stdc++", "dl", "m"]
}
}
}
}
}
- 修改編譯腳本參數
tools/build.py --external-modules=awtk-module --cmake-param=-DENABLE_MODULE_AWTK=ON
ENABLE_MODULE_ 一定要寫實際子產品的名稱,如果忘記将 MYMODULE 修改成實際子產品的名稱,出現的錯誤讓你完全不知道是什麼情況。
二、編譯參數
自己的子產品免不了使用外部庫,但是 modules.json 裡可以指定庫的名稱,卻不能指定庫的路徑和頭檔案的路徑。做了嘗試始終沒有成功,後來隻好自己寫了一個 cmake 檔案,在 iotjs 的 CMakeLists.txt 引用了。
awtk.cmake 的内容如下:
GET_FILENAME_COMPONENT(PROJ_ROOT "${CMAKE_CURRENT_LIST_DIR}/../../" ABSOLUTE)
SET(AWTK_ROOT ${PROJ_ROOT}/awtk)
SET(AWTK_JS_ROOT ${PROJ_ROOT}/awtk-js)
SET(APP_ASSETS_ROOT ${AWTK_ROOT}/demos)
SET(AWTK_JS_FILE ${AWTK_JS_ROOT}/src/awtk.js)
MESSAGE("AWTK_ROOT=${AWTK_ROOT}")
MESSAGE("AWTK_JS_ROOT=${AWTK_JS_ROOT}")
MESSAGE("AWTK_JS_ROOT=${CMAKE_CURRENT_LIST_DIR}")
SET( CMAKE_VERBOSE_MAKEFILE ON )
ADD_COMPILE_OPTIONS("-DAWTK_JS_FILE=\"${AWTK_JS_FILE}\"")
ADD_COMPILE_OPTIONS("-DAPP_ASSETS_ROOT=\"${APP_ASSETS_ROOT}\"")
LINK_DIRECTORIES("${AWTK_ROOT}/lib" "${AWTK_JS_ROOT}/lib")
INCLUDE_DIRECTORIES("${AWTK_ROOT}/src/" "${AWTK_ROOT}/src/ext_widgets/" "${AWTK_JS_ROOT}/src/jerryscript")
使用下面這行代碼開啟 verbose 模式,可以看到大量調試資訊,有助于快速定位問題所在:
SET( CMAKE_VERBOSE_MAKEFILE ON )
然後在 CMakeLists.txt 裡引用:
include(../awtk-iotjs/awtk-module/awtk.cmake)
include(cmake/iotjs.cmake)
一定要放在 iotjs.cmake 之前引用,否則無效。
三、放在獨立的目錄
将子產品放在獨立的目錄中,管理起來友善一些,awtk-iotjs 是為 iotjs 寫的子產品,它依賴與 awtk 和 awtk-js,将在幾個子產品放在同級的目錄。
- awtk
- awtk-js
- iotjs
- awtk-iotjs
${iotjs_ROOT}/tools/build.py --external-modules=${CWD}/awtk-module --cmake-param=-DENABLE_MODULE_AWTK=ON
if [ "$1" == "" ]; then
JS_FILE="demos/button.js"
else
JS_FILE="$1"
fi
${iotjs_ROOT}/build/x86_64-linux/debug/bin/iotjs "$JS_FILE"