JAVASCRIPT中调用二进制组件的方法.pdf

上传人:t**** 文档编号:5897188 上传时间:2019-03-30 格式:PDF 页数:10 大小:535.81KB
返回 下载 相关 举报
摘要
申请专利号:

CN201310367174.7

申请日:

2013.08.21

公开号:

CN104423932A

公开日:

2015.03.18

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F9/44申请日:20130821|||公开

IPC分类号:

G06F9/44

主分类号:

G06F9/44

申请人:

上海科泰世纪科技有限公司

发明人:

贾靖; 陈冬晓; 宋宇培

地址:

201203上海市张江高科技园区碧波路177号华虹科技园C区4层

优先权:

专利代理机构:

代理人:

PDF下载: PDF下载
内容摘要

本发明提供一种Javascript中调用二进制组件的方法,该方法包括:Javascript引擎获取Javascript语句中的字符串并判定是否为Javascript语言节点;若不是Javascript语言节点,则Javascript引擎的异常拦截器拦截并获取该字符串;从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件;创建该字符串对应的二进制组件对象并封装为Javascript对象。该方法实现在Javascript脚本解析执行过程中根据需要灵活加载二进制组件。

权利要求书

权利要求书
1.  一种Javascript中调用二进制组件的方法,应用于Javascript引擎中,其特征在于,该方法包括以下步骤以Javascript引擎的异常拦截方式实现调用二进制组件:
判定步骤:Javascript引擎获取Javascript语句中的字符串并判定该字符串是否为Javascript语言节点;
拦截步骤:若该字符串不是Javascript语言节点,Javascript引擎的异常拦截器拦截并获取该字符串;
检索步骤:从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件;
创建步骤:当二进制组件的加载路径中存在与该字符串对应的二进制组件时,创建该字符串对应的二进制组件对象并封装为Javascript对象。

2.  如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还包括:当判定Javascript语句中的字符串为Javascript语言节点,Javascript引擎解释并执行该Javascript语句。

3.  如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还包括:当二进制组件的加载路径中未查询到该字符串对应的二进制组件时,Javascript引擎进行异常报错处理。

4.  如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还以XPCOM组件封装二进制组件的方式实现调用二进制组件,包括以下步骤:
注册步骤:注册一个封装所有二进制组件的XPCOM组件;
重写步骤:重写该XPCOM组件创建对象的方法;
判定步骤:当Javascript引擎调用XPCOM组件对象的方法时,若调用方法的对象为上述XPCOM组件封装的二进制组件创建的对象,则使用二进制组件内部自建的方法调用该对象的方法,若调用方法的对象为标准XPCOM组件创建的对象,则调用XPCOM的标准Call方法调用该对象的方法。

5.  如权利要求1或4所述的Javascript中调用二进制组件的方法,其特征在于,当调用的二进制组件为CAR组件,在Javascript脚本中使用CAR组件的回调机制,实现在Javascript中回调函数的同步和异步回调。

6.  如权利要求5所述的Javascript中调用二进制组件的方法,其特征在于,该方法还包括:当调用的二进制组件为CAR组件,Javascript引擎在初始化时,创建一个回调执行线程执行回调事件的回调函数。

7.  如权利要求6所述的Javascript中调用二进制组件的方法,其特征在于,当调用CAR组件对象的方法而触发回调事件时,该回调事件的回调函数的执行过程为:
当该回调事件属性为同步时,若同步回调事件关联的回调函数为Javascript函数则由Javascript引擎主线程直接执行该回调函数,若同步回调事件关联的回调函数非Javascript函数则由回调执行线程执行该回调函数;
当该回调事件属性是异步时,Javascript主线程发送该回调事件给回调执行线程,回调执行线程捕捉该异步回调事件,若该异步回调事件关联的回调函数为Javascript函数,则回调执行线程将该异步回调事件和回调函数打包并回抛给Javascript引擎主线程,若该异步回调事件关联的回调函数非Javascript函数,则由回调执行线程执行该回调函数。

说明书

说明书Javascript中调用二进制组件的方法
技术领域
本发明涉及Javascript中调用自定义组件的技术,尤其涉及一种Javascript中调用二进制组件的方法。
背景技术
目前,使用浏览器作为本地应用的平台已经有了广泛的实际应用,HTML/CSS处理页面显示和美化,Javascript脚本处理页面逻辑。但是,Javascript作为脚本语言存在一定的先天局限性,出于安全性方面的考量,Javascript脚本不具备访问本地资源的能力,对于网络访问也受到同源策略(Same Origin Policy)的严格限制,所以,基于浏览器的应用在获取外部资源和外部程序的支持时,需要对浏览器进行额外的扩展,目前多数浏览器通过本地插件式扩展机制以扩展Javascript脚本的功能。
实现Javascript脚本调用组件的可行策略是,在Javascript引擎初始化时,增加一个组件的注册表,将组件的所有信息全部注册到Javascript运行环境的全局变量中。但是,将组件所有信息在Javascript初始化时全部注册的话,导致Javascript引擎初始化过程耗时且内存占用量过大。
发明内容
鉴于上述内容,有必要提出一种Javascript中调用二进制组件的方法,该方法可以实现在Javascript脚本运行时灵活调用二进制组件以扩展Javascript脚本的功能。
所述Javascript中调用二进制组件的方法,包括步骤:Javascript引擎获取Javascript语句中的字符串并判定是否为Javascript语言节点;若不是Javascript语言节点,Javascript引擎的异常拦截器拦截并获取该字符串;从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件;创建该字符串对应的二进制组件对象并封装为Javascript对象。
相比于现有技术,本发明所述Javascript中调用二进制组件的方法, 通过修改Javascript引擎的异常处理机制的方式,使得在Javascript脚本运行时活加载二进制组件。另外,当调用的二进制组件为支持同步和异步回调的CAR组件,在Javascript脚本中调用该CAR组件对象的方法而触发回调事件时,能够同步或是异步回调该回调事件的回调函数。
附图说明
图1是通过修改Javascript引擎的异常处理机制实现Javascript中调用CAR组件的方法流程图。
图2是一个CAR组件示例FooBar组件的的程序代码。
图3是触发回调事件执行异步回调的示意图。
具体实施方式
本较佳实施例中以CAR组件作为二进制组件的示例进行说明,本领域的技术人员可以将该方法应用到其他二进制组件中,以实现在Javascript中调用二进制组件。
所述CAR组件(Component Assembly Runtime)是上海科泰世纪科技有限公司开发的一种二进制组件,该CAR组件技术是在Elastos平台上(Elastos,一种组件化操作系统)面向组件的编程模型,规定了组件之间相互调用的标准,并且二进制组件能够自我描述。
所述CAR组件采用C++编写,携带有元数据(metadata),通过该元数据CAR组件可以实现反射机制。该元数据是描述数据的数据,对数据的抽象,主要包括了数据的类型信息,例如CAR组件的模块信息、接口信息、类信息等数据,且元数据与CAR组件的可执行代码存储在一起,是CAR组件的二进制描述。
所述CAR组件的反射机制,提供统一调用CAR组件内封装的所有接口的Invoke方法,形如:Invoke(object_name,method_name,parameters)以实现对CAR组件的统一封装。例如,在Javascript或是C语言的环境中调用某一CAR组件对象foo的方法Bar(例如:foo.Bar()),则在执行时通过反射机制调用Invoke方法(例如:Invoke(foo,Bar,Null),实现了对CAR组件对象所有方法具体调用的封装。
以上是对CAR组件的简单描述,关于CAR组件的详细内容可参考 CAR组件的使用说明手册等。
参阅图1所示,是通过修改Javascript引擎的异常处理机制实现Javascript中调用CAR组件的方法流程图。
步骤S01,Javascript引擎获取Javascript语句中的字符串。
Javascript是一种解释执行的语言,由浏览器的Javascript引擎解释执行。在Javascript中调用自定义组件时,一般是在Javascript引擎初始化时预先注册自定义组件,使得在调用过程中能够将自定义组件正确解析执行。而本较佳实施例中,对Javascript引擎的异常处理机制进行扩展,以实现在Javascript脚本解析执行时根据需要灵活加载CAR组件。
步骤S02,判定上述字符串是否为Javascript的标准语言节点,若是则进入步骤S03,否则进入步骤S04。
例如,Javascript脚本中var foo=new CFoo(),CFoo()为CAR组件中的一个类,CFoo()在当前Javascript脚本的上下文(Context)中并未定义,Javascript引擎无法执行new CFoo()以创建foo对象,此时,Javascript引擎因该CFoo()不是Javascript标准语言节点,无法识别而抛出异常。
步骤S03,Javascript引擎解释并执行该Javascript语句。
步骤S04,Javascript引擎的异常拦截器进行拦截并获取该异常(非Javascript的标准语言节点)的字符串。
接续上述举例,当Javascript引擎抛出异常节点CFoo(),异常拦截器拦截并获取异常的字符串或语言节点。
步骤S05,从CAR组件加载路径中查询是否存在该字符串对应的CAR组件,若存在,则进入步骤S07,否则进入步骤S06。
步骤S06,Javascript引擎异常报错处理。
当不存在该字符串对应的CAR组件,该节点既不是Javascript的语言节点,也不是CAR组件,则Javascript引擎无法识别该字符串,无法解释执行,则进行报错处理。
步骤S07,Javascript引擎创建该字符串对应的CAR组件对象。
步骤S08,利用Javascript引擎的API(Application Programming Interface,应用程序接口)将创建的CAR组件对象封装为Javascript对象返回到Javascript的运行环境中。
以上拦截Javascript引擎异常的方式实现Javascript中调用CAR组 件,根据Javascript脚本中调用组件的情形灵活加载CAR组件。
在实际应用中,当浏览器为Mozilla组织提供的浏览器(例如:Firefox火狐浏览器)或Javascript引擎为Mozilla组织所提供的SpiderMonkey,还可以通过以XPCOM组件形式接入CAR组件,实现在Javascript脚本中调用CAR组件。
所述Mozilla组织(Mozilla,哥斯拉)是一个支持和领导开源的Mozilla项目而设立的非盈利组织。所述SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的Javascript脚本引擎,该引擎支持在Javascript脚本中调用XPCOM组件。所述XPCOM(Cross Platform Component Object Model,XPCOM),是Mozilla的跨平台组件对象模型,类似微软的COM(Component Object Model,组件对象模型)。
所述以XPCOM组件形式接入CAR组件,通过以下步骤实现:
a)在Javascript引擎中注册封装所有CAR组件的一个XPCOM组件,如注册一个名为elastos的XPCOM组件;
b)重写上述的XPCOM组件elastos创建对象的方法createInstance方法,例如,var foo=elastos.createInstance(“path/class_name:version”),创建elastos封装的某一个CAR组件的一个类对象foo,createInstance的参数为“CAR组件加载路径/类名:版本号”;
c)修改Javascript引擎中调用XPCOM组件对象的方法的Call方法,在调用组件对象的方法时增加一个判定,若调用方法的对象是elastos创建的对象时,则使用CAR组件内部自建的Invoke方法调用该组件对象的方法;若为其他标准XPCOM组件创建的对象时,则使用XPCOM组件的标准Call方法调用组件对象的方法。例如,上述CAR组件的类对象foo,在Javascript中执行foo.doWork(),doWork()为foo的一个方法,若foo为标准XPCOM组件创建的对象,则Javascript引擎通过调用Call方法来调用执行doWork()方法;若foo为elastos这个XPCOM组件创建的对象,则Javascript引擎通过调用CAR组件内部的Invoke方法来调用执行doWork()方法。
需要说明,上述XPCOM组件封装CAR组件的方式实现Javascript脚本中调用CAR组件,具有一定局限性,仅针对于Mozilla的浏览器。
需要指出的是,Javascript语法中对于回调的支持形式单一,仅支持 同步回调及定时延迟回调,并没有支持异步回调。基于上述两种不同方式实现Javascript脚本中调用CAR组件的基础上(拦截Javascript引擎异常或XPCOM组件封装CAR组件),进一步在Javascript脚本中使用CAR组件的回调机制,实现在Javascript中对回调函数的同步和异步回调。
结合图2所示的CAR组件示例FooBar组件的程序代码,详细说明Javascript中调用CAR组件的同步和异步回调机制。
1)修改Javascript引擎的异常处理机制或是注册elastos的XPCOM组件,Javascript引擎初始化时创建CAR组件的回调执行线程。
2)在Javascript页面中创建CAR组件对象。
形如:
var foobar=new CFooBar();//拦截异常方式调用CAR组件
var foobar=elastos.createInstance(
“Com.Elastos.Components.Foobar.eco/CFooBar:1”);
//XPCOM形式调用CAR组件
如图2所示,FooBar组件中包括有一个名为CFooBar的类,该类实现了接口IFoo和IBar的Foo()方法和Bar()方法,其中,Foo()方法中的代码Callback::FooEvent()是指在Foo()方法被调用执行时会触发异步回调事件FooEvent,Bar()方法中的代码Delegate::FooErrand()是指在Bar()方法被调用执行时会触发同步回调事件FooErrand。
3)在Javascript代码中定义回调事件的回调函数。
形如:

4)关联注册回调事件和回调函数。
形如:
foobar.addCallback(FooEvent,FooEventHandler);
foobar.addCallback(FooErrand,FooErrandHandler);
5)Javascript脚本中调用CAR组件对象的方法而触发回调事件。
形如:
foobar.Foo();//Foo方法调用执行,触发异步回调事件FooEvent
foobar.Bar();//Bar方法调用执行,触发同步回调事件FooErrand
Javascript编程人员通过CAR组件的说明手册,可以明确知道CAR组件所包括的类、方法及方法调用时触发的回调事件,回调事件的属性是同步或是异步(delegate或callback)是由CAR组件的开发人员在开发时指定,可以为编程人员所获悉。
JavaScript代码中的foobar.Foo()和foobar.Bar()的调用会触发定义的回调事件,至于这个回调事件的属性是同步回调还是异步回调,取决于调用的CAR组件方法触发回调事件时所调用的是异步回调接口(Callback::FooEvent)还是同步回调接口(Delegate::FooErrand)。
6)触发回调事件,当该回调事件属性是同步时,若该回调事件关联的回调函数为Javascript函数则Javascript引擎主线程执行该回调函数,若关联的回调函数非Javascript函数(如C或C++的函数)则回调执行线程执行该回调函数;当该回调事件属性是异步时,如图3示,Javascript主线程发送该回调事件给回调执行线程,回调执行线程捕捉该回调事件,若该异步回调事件关联的回调函数为Javascript函数,则回调执行线程将该异步回调事件以及回调函数打包并回抛给Javascript引擎主线程,若关联的回调函数非Javascript函数,则回调执行线程执行该回调函数。
以FooEvent该异步回调事件为例,详细说明异步回调执行过程:如图2所示,CAR组件中Foo方法是调用异步回调接口Callback::FooEvent,则该回调事件FooEvent为异步事件;如图3所示Javascript引擎主线程执行foobar.Foo()的方法调用,该方法Foo()触发产生回调事件FooEvent;Javascript引擎主线程将该异步回调事件发送给回调执行线程;回调执行线程接收该回调事件并进行处理;若该回调事件的回调函数为C或C++语言编写,则回调执行线程执行该回调函数;若该回调事件的回调函数为Javascript语言编写,则回调执行线程将该回调事件和关联的回调函数打包并回抛给Javascript引擎主线程,Javascript引擎主线程的消息队列 接收回抛的回调事件并依序处理该回调事件的回调函数。
需要说明的是,由于Javascript引擎限定所有Javascript代码必须由且仅由Javascript引擎主线程执行,该限定使得当触发异步回调事件时,虽Javascript引擎主线程将该回调事件抛到回调执行线程中,但是由于回调执行线程无法执行Javascript代码的回调函数,故只能将该回调事件重新回抛至Javascript引擎主线程。
最后需要指出的是,以上具体实施方式仅用于说明本发明的技术方案而非限制,本领域的普通技术人员应当理解,对本发明的技术方案进行等同替换或是修改,都不应脱离本发明技术方案的精神范围。

JAVASCRIPT中调用二进制组件的方法.pdf_第1页
第1页 / 共10页
JAVASCRIPT中调用二进制组件的方法.pdf_第2页
第2页 / 共10页
JAVASCRIPT中调用二进制组件的方法.pdf_第3页
第3页 / 共10页
点击查看更多>>
资源描述

《JAVASCRIPT中调用二进制组件的方法.pdf》由会员分享,可在线阅读,更多相关《JAVASCRIPT中调用二进制组件的方法.pdf(10页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 (43)申请公布日 (21)申请号 201310367174.7 (22)申请日 2013.08.21 G06F 9/44(2006.01) (71)申请人 上海科泰世纪科技有限公司 地址 201203 上海市张江高科技园区碧波路 177 号华虹科技园 C 区 4 层 (72)发明人 贾靖 陈冬晓 宋宇培 (54) 发明名称 Javascript 中调用二进制组件的方法 (57) 摘要 本发明提供一种 Javascript 中调用二进 制组件的方法, 该方法包括 : Javascript 引擎获 取 Javascript 语句中的字符串并判定是否为 Javascript语言。

2、节点 ; 若不是Javascript语言节 点, 则 Javascript 引擎的异常拦截器拦截并获取 该字符串 ; 从二进制组件的加载路径中查询是否 存在该字符串对应的二进制组件 ; 创建该字符串 对应的二进制组件对象并封装为 Javascript 对 象。 该方法实现在Javascript脚本解析执行过程 中根据需要灵活加载二进制组件。 (51)Int.Cl. (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书1页 说明书5页 附图3页 (10)申请公布号 CN 104423932 A (43)申请公布日 2015.03.18 CN 104423932 A 1/1 页 。

3、2 1. 一种 Javascript 中调用二进制组件的方法, 应用于 Javascript 引擎中, 其特征在 于, 该方法包括以下步骤以 Javascript 引擎的异常拦截方式实现调用二进制组件 : 判定步骤 : Javascript 引擎获取 Javascript 语句中的字符串并判定该字符串是否为 Javascript 语言节点 ; 拦截步骤 : 若该字符串不是 Javascript 语言节点, Javascript 引擎的异常拦截器拦截 并获取该字符串 ; 检索步骤 : 从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件 ; 创建步骤 : 当二进制组件的加载路径中存在与该。

4、字符串对应的二进制组件时, 创建该 字符串对应的二进制组件对象并封装为 Javascript 对象。 2. 如权利要求 1 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 包括 : 当判定 Javascript 语句中的字符串为 Javascript 语言节点, Javascript 引擎解释 并执行该 Javascript 语句。 3. 如权利要求 1 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 包括 : 当二进制组件的加载路径中未查询到该字符串对应的二进制组件时, Javascript 引 擎进行异常报错处理。 4. 如权。

5、利要求 1 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 以 XPCOM 组件封装二进制组件的方式实现调用二进制组件, 包括以下步骤 : 注册步骤 : 注册一个封装所有二进制组件的 XPCOM 组件 ; 重写步骤 : 重写该 XPCOM 组件创建对象的方法 ; 判定步骤 : 当 Javascript 引擎调用 XPCOM 组件对象的方法时, 若调用方法的对象为上 述 XPCOM 组件封装的二进制组件创建的对象, 则使用二进制组件内部自建的方法调用该对 象的方法, 若调用方法的对象为标准 XPCOM 组件创建的对象, 则调用 XPCOM 的标准 Call 方 法。

6、调用该对象的方法。 5. 如权利要求 1 或 4 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 当 调用的二进制组件为 CAR 组件, 在 Javascript 脚本中使用 CAR 组件的回调机制, 实现在 Javascript 中回调函数的同步和异步回调。 6. 如权利要求 5 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 包括 : 当调用的二进制组件为 CAR 组件, Javascript 引擎在初始化时, 创建一个回调执行线 程执行回调事件的回调函数。 7. 如权利要求 6 所述的 Javascript 中调用二进制组件的方法, 。

7、其特征在于, 当调用 CAR 组件对象的方法而触发回调事件时, 该回调事件的回调函数的执行过程为 : 当该回调事件属性为同步时, 若同步回调事件关联的回调函数为 Javascript 函数 则由 Javascript 引擎主线程直接执行该回调函数, 若同步回调事件关联的回调函数非 Javascript 函数则由回调执行线程执行该回调函数 ; 当该回调事件属性是异步时, Javascript 主线程发送该回调事件给回调执行线程, 回 调执行线程捕捉该异步回调事件, 若该异步回调事件关联的回调函数为 Javascript 函数, 则回调执行线程将该异步回调事件和回调函数打包并回抛给 Javascr。

8、ipt 引擎主线程, 若 该异步回调事件关联的回调函数非 Javascript 函数, 则由回调执行线程执行该回调函数。 权 利 要 求 书 CN 104423932 A 2 1/5 页 3 Javascript 中调用二进制组件的方法 技术领域 0001 本发明涉及 Javascript 中调用自定义组件的技术, 尤其涉及一种 Javascript 中 调用二进制组件的方法。 背景技术 0002 目前, 使用浏览器作为本地应用的平台已经有了广泛的实际应用, HTML/CSS 处理 页面显示和美化, Javascript 脚本处理页面逻辑。但是, Javascript 作为脚本语言存在一 定的。

9、先天局限性, 出于安全性方面的考量, Javascript 脚本不具备访问本地资源的能力, 对 于网络访问也受到同源策略 (Same Origin Policy) 的严格限制, 所以, 基于浏览器的应用 在获取外部资源和外部程序的支持时, 需要对浏览器进行额外的扩展, 目前多数浏览器通 过本地插件式扩展机制以扩展 Javascript 脚本的功能。 0003 实现Javascript脚本调用组件的可行策略是, 在Javascript引擎初始化时, 增加 一个组件的注册表, 将组件的所有信息全部注册到 Javascript 运行环境的全局变量中。但 是, 将组件所有信息在Javascript初始。

10、化时全部注册的话, 导致Javascript引擎初始化过 程耗时且内存占用量过大。 发明内容 0004 鉴于上述内容, 有必要提出一种 Javascript 中调用二进制组件的方法, 该方法可 以实现在 Javascript 脚本运行时灵活调用二进制组件以扩展 Javascript 脚本的功能。 0005 所述 Javascript 中调用二进制组件的方法, 包括步骤 : Javascript 引擎获取 Javascript 语句中的字符串并判定是否为 Javascript 语言节点 ; 若不是 Javascript 语 言节点, Javascript 引擎的异常拦截器拦截并获取该字符串 ; 。

11、从二进制组件的加载路径中 查询是否存在该字符串对应的二进制组件 ; 创建该字符串对应的二进制组件对象并封装为 Javascript 对象。 0006 相比于现有技术, 本发明所述 Javascript 中调用二进制组件的方法, 通过修改 Javascript 引擎的异常处理机制的方式, 使得在 Javascript 脚本运行时活加载二进制组 件。另外, 当调用的二进制组件为支持同步和异步回调的 CAR 组件, 在 Javascript 脚本中 调用该 CAR 组件对象的方法而触发回调事件时, 能够同步或是异步回调该回调事件的回调 函数。 附图说明 0007 图 1 是通过修改 Javascri。

12、pt 引擎的异常处理机制实现 Javascript 中调用 CAR 组 件的方法流程图。 0008 图 2 是一个 CAR 组件示例 FooBar 组件的的程序代码。 0009 图 3 是触发回调事件执行异步回调的示意图。 说 明 书 CN 104423932 A 3 2/5 页 4 具体实施方式 0010 本较佳实施例中以 CAR 组件作为二进制组件的示例进行说明, 本领域的技术人员 可以将该方法应用到其他二进制组件中, 以实现在 Javascript 中调用二进制组件。 0011 所述 CAR 组件 (Component Assembly Runtime) 是上海科泰世纪科技有限公司开 发。

13、的一种二进制组件, 该 CAR 组件技术是在 Elastos 平台上 (Elastos, 一种组件化操作系 统 ) 面向组件的编程模型, 规定了组件之间相互调用的标准, 并且二进制组件能够自我描 述。 0012 所述 CAR 组件采用 C+ 编写, 携带有元数据 (metadata), 通过该元数据 CAR 组件 可以实现反射机制。 该元数据是描述数据的数据, 对数据的抽象, 主要包括了数据的类型信 息, 例如CAR组件的模块信息、 接口信息、 类信息等数据, 且元数据与CAR组件的可执行代码 存储在一起, 是 CAR 组件的二进制描述。 0013 所述 CAR 组件的反射机制, 提供统一调用。

14、 CAR 组件内封装的所有接口的 Invoke 方 法, 形如 : Invoke(object_name, method_name, parameters) 以实现对 CAR 组件的统一封装。 例如, 在 Javascript 或是 C 语言的环境中调用某一 CAR 组件对象 foo 的方法 Bar( 例如 : foo.Bar(), 则在执行时通过反射机制调用 Invoke 方法 ( 例如 : Invoke(foo, Bar, Null), 实现了对 CAR 组件对象所有方法具体调用的封装。 0014 以上是对 CAR 组件的简单描述, 关于 CAR 组件的详细内容可参考 CAR 组件的使用 。

15、说明手册等。 0015 参阅图 1 所示, 是通过修改 Javascript 引擎的异常处理机制实现 Javascript 中 调用 CAR 组件的方法流程图。 0016 步骤 S01, Javascript 引擎获取 Javascript 语句中的字符串。 0017 Javascript 是一种解释执行的语言, 由浏览器的 Javascript 引擎解释执行。在 Javascript 中调用自定义组件时, 一般是在 Javascript 引擎初始化时预先注册自定义组 件, 使得在调用过程中能够将自定义组件正确解析执行。 而本较佳实施例中, 对Javascript 引擎的异常处理机制进行扩展,。

16、 以实现在 Javascript 脚本解析执行时根据需要灵活加载 CAR 组件。 0018 步骤 S02, 判定上述字符串是否为 Javascript 的标准语言节点, 若是则进入步骤 S03, 否则进入步骤 S04。 0019 例如, Javascript脚本中var foonew CFoo(), CFoo()为CAR组件中的一个类, CFoo() 在当前 Javascript 脚本的上下文 (Context) 中并未定义, Javascript 引擎无法执 行 new CFoo() 以创建 foo 对象, 此时, Javascript 引擎因该 CFoo() 不是 Javascript 标。

17、准 语言节点, 无法识别而抛出异常。 0020 步骤 S03, Javascript 引擎解释并执行该 Javascript 语句。 0021 步骤 S04, Javascript 引擎的异常拦截器进行拦截并获取该异常 ( 非 Javascript 的标准语言节点 ) 的字符串。 0022 接续上述举例, 当 Javascript 引擎抛出异常节点 CFoo(), 异常拦截器拦截并获取 异常的字符串或语言节点。 0023 步骤S05, 从CAR组件加载路径中查询是否存在该字符串对应的CAR组件, 若存在, 则进入步骤 S07, 否则进入步骤 S06。 说 明 书 CN 104423932 A 。

18、4 3/5 页 5 0024 步骤 S06, Javascript 引擎异常报错处理。 0025 当不存在该字符串对应的 CAR 组件, 该节点既不是 Javascript 的语言节点, 也不 是 CAR 组件, 则 Javascript 引擎无法识别该字符串, 无法解释执行, 则进行报错处理。 0026 步骤 S07, Javascript 引擎创建该字符串对应的 CAR 组件对象。 0027 步骤S08, 利用Javascript引擎的API(Application Programming Interface, 应 用程序接口 ) 将创建的 CAR 组件对象封装为 Javascript 对。

19、象返回到 Javascript 的运行环 境中。 0028 以上拦截 Javascript 引擎异常的方式实现 Javascript 中调用 CAR 组件, 根据 Javascript 脚本中调用组件的情形灵活加载 CAR 组件。 0029 在实际应用中, 当浏览器为 Mozilla 组织提供的浏览器 ( 例如 : Firefox 火狐浏览 器)或Javascript引擎为Mozilla组织所提供的SpiderMonkey, 还可以通过以XPCOM组件 形式接入 CAR 组件, 实现在 Javascript 脚本中调用 CAR 组件。 0030 所述 Mozilla 组织 (Mozilla, 。

20、哥斯拉 ) 是一个支持和领导开源的 Mozilla 项目而 设立的非盈利组织。所述 SpiderMonkey 是 Mozilla 项目的一部分, 是一个用 C 语言实现的 Javascript脚本引擎, 该引擎支持在Javascript脚本中调用XPCOM组件。 所述XPCOM(Cross Platform Component Object Model, XPCOM), 是Mozilla的跨平台组件对象模型, 类似微软 的 COM(Component Object Model, 组件对象模型 )。 0031 所述以 XPCOM 组件形式接入 CAR 组件, 通过以下步骤实现 : 0032 a)。

21、在Javascript引擎中注册封装所有CAR组件的一个XPCOM组件, 如注册一个名 为 elastos 的 XPCOM 组件 ; 0033 b) 重写上述的 XPCOM 组件 elastos 创建对象的方法 createInstance 方法, 例如, var foo elastos.createInstance(“path/class_name : version” ), 创建 elastos 封装 的某一个 CAR 组件的一个类对象 foo, createInstance 的参数为 “CAR 组件加载路径 / 类 名 : 版本号” ; 0034 c) 修改 Javascript 引擎中。

22、调用 XPCOM 组件对象的方法的 Call 方法, 在调用组件 对象的方法时增加一个判定, 若调用方法的对象是 elastos 创建的对象时, 则使用 CAR 组 件内部自建的 Invoke 方法调用该组件对象的方法 ; 若为其他标准 XPCOM 组件创建的对象 时, 则使用 XPCOM 组件的标准 Call 方法调用组件对象的方法。例如, 上述 CAR 组件的类对 象 foo, 在 Javascript 中执行 foo.doWork(), doWork() 为 foo 的一个方法, 若 foo 为标准 XPCOM组件创建的对象, 则Javascript引擎通过调用Call方法来调用执行do。

23、Work()方法 ; 若 foo 为 elastos 这个 XPCOM 组件创建的对象, 则 Javascript 引擎通过调用 CAR 组件内部 的 Invoke 方法来调用执行 doWork() 方法。 0035 需要说明, 上述 XPCOM 组件封装 CAR 组件的方式实现 Javascript 脚本中调用 CAR 组件, 具有一定局限性, 仅针对于 Mozilla 的浏览器。 0036 需要指出的是, Javascript 语法中对于回调的支持形式单一, 仅支持同步回调及 定时延迟回调, 并没有支持异步回调。基于上述两种不同方式实现 Javascript 脚本中调 用 CAR 组件的基。

24、础上 ( 拦截 Javascript 引擎异常或 XPCOM 组件封装 CAR 组件 ), 进一步在 Javascript脚本中使用CAR组件的回调机制, 实现在Javascript中对回调函数的同步和异 步回调。 说 明 书 CN 104423932 A 5 4/5 页 6 0037 结合图 2 所示的 CAR 组件示例 FooBar 组件的程序代码, 详细说明 Javascript 中 调用 CAR 组件的同步和异步回调机制。 0038 1) 修改 Javascript 引擎的异常处理机制或是注册 elastos 的 XPCOM 组件, Javascript 引擎初始化时创建 CAR 组件。

25、的回调执行线程。 0039 2) 在 Javascript 页面中创建 CAR 组件对象。 0040 形如 : 0041 var foobar new CFooBar() ; / 拦截异常方式调用 CAR 组件 0042 var foobar elastos.createInstance( 0043 “Com.Elastos.Components.Foobar.eco/CFooBar : 1” ) ; 0044 /XPCOM 形式调用 CAR 组件 0045 如图 2 所示, FooBar 组件中包括有一个名为 CFooBar 的类, 该类实现了接口 IFoo 和 IBar 的 Foo() 方。

26、法和 Bar() 方法, 其中, Foo() 方法中的代码 Callback : FooEvent() 是指在 Foo() 方法被调用执行时会触发异步回调事件 FooEvent, Bar() 方法中的代码 Delegate : : FooErrand()是指在Bar()方法被调用执行时会触发同步回调事件FooErrand。 0046 3) 在 Javascript 代码中定义回调事件的回调函数。 0047 形如 : 0048 0049 4) 关联注册回调事件和回调函数。 0050 形如 : 0051 foobar.addCallback(FooEvent, FooEventHandler) ;。

27、 0052 foobar.addCallback(FooErrand, FooErrandHandler) ; 0053 5)Javascript 脚本中调用 CAR 组件对象的方法而触发回调事件。 0054 形如 : 0055 foobar.Foo() ; /Foo 方法调用执行, 触发异步回调事件 FooEvent 0056 foobar.Bar() ; /Bar 方法调用执行, 触发同步回调事件 FooErrand 0057 Javascript 编程人员通过 CAR 组件的说明手册, 可以明确知道 CAR 组件所包括 的类、 方法及方法调用时触发的回调事件, 回调事件的属性是同步或是异。

28、步 (delegate 或 callback) 是由 CAR 组件的开发人员在开发时指定, 可以为编程人员所获悉。 0058 JavaScript 代码中的 foobar.Foo() 和 foobar.Bar() 的调用会触发定义的回 说 明 书 CN 104423932 A 6 5/5 页 7 调事件, 至于这个回调事件的属性是同步回调还是异步回调, 取决于调用的 CAR 组件方法 触发回调事件时所调用的是异步回调接口 (Callback : FooEvent) 还是同步回调接口 (Delegate : FooErrand)。 0059 6) 触发回调事件, 当该回调事件属性是同步时, 若该。

29、回调事件关联的回调函数 为 Javascript 函数则 Javascript 引擎主线程执行该回调函数, 若关联的回调函数非 Javascript 函数 ( 如 C 或 C+ 的函数 ) 则回调执行线程执行该回调函数 ; 当该回调事件属 性是异步时, 如图 3 示, Javascript 主线程发送该回调事件给回调执行线程, 回调执行线程 捕捉该回调事件, 若该异步回调事件关联的回调函数为 Javascript 函数, 则回调执行线程 将该异步回调事件以及回调函数打包并回抛给 Javascript 引擎主线程, 若关联的回调函 数非 Javascript 函数, 则回调执行线程执行该回调函数。

30、。 0060 以 FooEvent 该异步回调事件为例, 详细说明异步回调执行过程 : 如图 2 所示, CAR 组件中 Foo 方法是调用异步回调接口 Callback : FooEvent, 则该回调事件 FooEvent 为异 步事件 ; 如图 3 所示 Javascript 引擎主线程执行 foobar.Foo() 的方法调用, 该方法 Foo() 触发产生回调事件 FooEvent ; Javascript 引擎主线程将该异步回调事件发送给回调执行 线程 ; 回调执行线程接收该回调事件并进行处理 ; 若该回调事件的回调函数为 C 或 C+ 语 言编写, 则回调执行线程执行该回调函数 。

31、; 若该回调事件的回调函数为 Javascript 语言编 写, 则回调执行线程将该回调事件和关联的回调函数打包并回抛给 Javascript 引擎主线 程, Javascript 引擎主线程的消息队列接收回抛的回调事件并依序处理该回调事件的回调 函数。 0061 需要说明的是, 由于 Javascript 引擎限定所有 Javascript 代码必须由且仅由 Javascript 引擎主线程执行, 该限定使得当触发异步回调事件时, 虽 Javascript 引擎主线 程将该回调事件抛到回调执行线程中, 但是由于回调执行线程无法执行 Javascript 代码 的回调函数, 故只能将该回调事件重新回抛至 Javascript 引擎主线程。 0062 最后需要指出的是, 以上具体实施方式仅用于说明本发明的技术方案而非限制, 本领域的普通技术人员应当理解, 对本发明的技术方案进行等同替换或是修改, 都不应脱 离本发明技术方案的精神范围。 说 明 书 CN 104423932 A 7 1/3 页 8 图 1 说 明 书 附 图 CN 104423932 A 8 2/3 页 9 图 2 说 明 书 附 图 CN 104423932 A 9 3/3 页 10 图 3 说 明 书 附 图 CN 104423932 A 10 。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1