javascript中AWTK绑定的原理是什么

发布时间:2021-06-30 17:57:44 作者:Leah
来源:亿速云 阅读:150

这篇文章给大家介绍 javascript中AWTK绑定的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

一、基本架构

Javascript的绑定方法和lua的绑定方法有些不同,主要原因是javascript的引擎有很多种,比如嵌入式系统常用的jerryscript和PC上常用的V8。不同的引擎提供注册C/C++函数的能力不同,所以在绑定时我们只对引擎做一个最低能力的要求:提供注册全局函数的能力。

我们把绑定的代码分两层:

这样的好处有:

二、引擎相关的代码(jerryscript为例)

1.成员函数的绑定

C语言里面的成员函数其实都是全局函数,按全局函数的绑定方式绑定即可,构造函数和非构造函数按同样的方式处理。如:

jerry_value_t wrap_button_create(const jerry_value_t func_obj_val, const jerry_value_t this_p,
                                 const jerry_value_t args_p[], const jerry_length_t args_cnt) {
  widget_t* ret = NULL;
  widget_t* parent = (widget_t*)jerry_get_pointer(args_p[0], "widget_t*");
  xy_t x = (xy_t)jerry_get_number_value(args_p[1]);
  xy_t y = (xy_t)jerry_get_number_value(args_p[2]);
  wh_t w = (wh_t)jerry_get_number_value(args_p[3]);
  wh_t h = (wh_t)jerry_get_number_value(args_p[4]);
  ret = (widget_t*)button_create(parent, x, y, w, h);

  return jerry_create_pointer(ret, "button_t*");
};
jerryx_handler_register_global((const jerry_char_t*)"button_create", wrap_button_create);
2.对象属性的绑定

对象的属性转换成set/get函数,再按全局函数注册。

jerry_value_t wrap_widget_t_set_prop_visible(const jerry_value_t func_obj_val,
                                             const jerry_value_t this_p,
                                             const jerry_value_t args_p[],
                                             const jerry_length_t args_cnt) {
  widget_t* obj = (widget_t*)jerry_get_pointer(args_p[0], "widget_t*");
  bool_t visible = (bool_t)jerry_get_boolean_value(args_p[1]);
  obj->visible = visible;
  return jerry_create_number(RET_OK);
}

jerry_value_t wrap_widget_t_get_prop_visible(const jerry_value_t func_obj_val,
                                             const jerry_value_t this_p,
                                             const jerry_value_t args_p[],
                                             const jerry_length_t args_cnt) {
  widget_t* obj = (widget_t*)jerry_get_pointer(args_p[0], "widget_t*");

  return jerry_create_boolean(obj->visible);
  
}
  jerryx_handler_register_global((const jerry_char_t*)"widget_t_set_prop_visible",
                                 wrap_widget_t_set_prop_visible);
  jerryx_handler_register_global((const jerry_char_t*)"widget_t_get_prop_visible",
                                 wrap_widget_t_get_prop_visible);
3.常量的绑定

常量的绑定,对每一个常量提供一个get函数即可。如:

jerry_value_t get_WIDGET_PROP_MAX_W(const jerry_value_t func_obj_val, const jerry_value_t this_p,
                                    const jerry_value_t args_p[], const jerry_length_t args_cnt) {
  return jerry_create_string_from_utf8((const jerry_char_t*)WIDGET_PROP_MAX_W);
}
jerryx_handler_register_global((const jerry_char_t*)"WIDGET_PROP_MAX_W", get_WIDGET_PROP_MAX_W);

三、引擎无相关的代码

1.类的封装

class Bitmap {
 public nativeObj;
 constructor(nativeObj) {
   this.nativeObj = nativeObj;
 }

 static create() {
   return new Bitmap(bitmap_create());
 }
 ...
}

2.对象属性的封装

这里利用了Typescript的set/get函数,实现起来非常方便:

 set visible(value) {
   widget_t_set_prop_visible(this.nativeObj, value);
 }

 get visible() {
   return widget_t_get_prop_visible(this.nativeObj);
 }

3.成员函数封装

自动使用nativeObj作为成员函数的第一个参数,然后调用绑定的C函数。

 layout() {
   return widget_layout(this.nativeObj);
 }

4.常量的封装

常量封装为枚举,幸运的是,Typescript枚举可以是数字类型,也可以是字符串类型,实现起来非常方便。

enum AlignV {
 NONE = ALIGN_V_NONE(),
 MIDDLE = ALIGN_V_MIDDLE(),
 TOP = ALIGN_V_TOP(),
 BOTTOM = ALIGN_V_BOTTOM(),
};
enum WidgetProp {
 X = WIDGET_PROP_X(),
 Y = WIDGET_PROP_Y(),
 W = WIDGET_PROP_W(),
 H = WIDGET_PROP_H(),
 ...
};

四、自动代码产生器

所有代码均由自动代码产生器根据awtk的IDL生成,具体请参考:tools/js_gen;

五、使用示例

function applicationInit() {
  var win = Window.create(null, 0, 0, 0, 0); 
  var ok = Button.create(win, 0, 0, 0, 0); 

  ok.setText("ok");
  ok.setSelfLayoutParams("center", "middle", "50%", "30");

  ok.on(EventType.CLICK, function(evt) {
    var e = PointerEvent.cast(evt);
    print("on click: " + e.x + " " + e.y);

    return Ret.OK;
  }); 

  win.layout();
}

applicationInit()

关于 javascript中AWTK绑定的原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. vue中数据双向绑定的原理是什么
  2. JavaScript中绑定事件的顺序是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

awtk javascript

上一篇:CenOS7用yum安装Docker的方法

下一篇:Java中Comparable和Comparator接口有什么区别

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》