如何为iotjs开发原生模块

这篇文章主要介绍“ 如何为iotjs开发原生模块”,在日常操作中,相信很多人在 如何为iotjs开发原生模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答” 如何为iotjs开发原生模块”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为 iotjs 开发原生模块

iotjs 是三星开源的 javascript 物联网开发平台。它为 javascript 应用程序提供了访问硬件、网络、文件系统和异步化的能力,功能类似于 nodejs,但无论是代码体积还是内存需求,iotjs 都要小很多,是用 javascript 开发 iot 设备应用程序的首选。

AWTK 全称 Toolkit AnyWhere,是 ZLG 开发的开源 GUI 引擎,旨在为嵌入式系统、WEB、各种小程序、手机和 PC 打造的通用 GUI 引擎,为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎。

一、修改模块的名称

如果模块的名称使用 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"

到此,关于“ 如何为iotjs开发原生模块”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!