CN105743955A - 一种扩展JavaScript对象方法 - Google Patents

一种扩展JavaScript对象方法 Download PDF

Info

Publication number
CN105743955A
CN105743955A CN201410768954.7A CN201410768954A CN105743955A CN 105743955 A CN105743955 A CN 105743955A CN 201410768954 A CN201410768954 A CN 201410768954A CN 105743955 A CN105743955 A CN 105743955A
Authority
CN
China
Prior art keywords
javascript
layer
message
java
javascript object
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201410768954.7A
Other languages
English (en)
Other versions
CN105743955B (zh
Inventor
胡琳琳
王硕
郭志川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Institute of Acoustics CAS
Shanghai 3Ntv Network Technology Co Ltd
Original Assignee
Institute of Acoustics CAS
Shanghai 3Ntv Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Institute of Acoustics CAS, Shanghai 3Ntv Network Technology Co Ltd filed Critical Institute of Acoustics CAS
Priority to CN201410768954.7A priority Critical patent/CN105743955B/zh
Publication of CN105743955A publication Critical patent/CN105743955A/zh
Application granted granted Critical
Publication of CN105743955B publication Critical patent/CN105743955B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

一种扩展JavaScript对象的方法,所述方法包括:页面调用JavaScript对象,并将调用请求通过JavaScript层的自定义对象,Java层的对象,JNI的对象传递到C++层的对象;C++层的对象根据请求调用本地组件进行异步处理;处理结束之后,返回回调消息;C++层对象将回调的消息内容封装为JSON格式,通过socket客户端发送;在Java层,socket服务端接收消息,并把消息放在当前显示的WebView中的消息队列中;JavaScript层的自定义对象定时从消息队列中取出消息;触发JavaScript对象的事件,将消息以事件的形式通知页面。

Description

一种扩展JavaScript对象方法
技术领域
本发明涉及Android系统的Web应用领域,尤其涉及一种扩展JavaScript对象方法。
背景技术
随着HTML5的兴起,浏览器的功能逐渐丰富,可以实现一些本地化的功能,包括本地存储,视频播放等。以浏览器为载体的Web应用具有开发门槛低,容易移植等优点。为了丰富Web应用的功能,在构建Web应用的时候,一个重要的问题是需要将本地组件(一般为C/C++的动态库)的接口扩展为JavaScript(脚本,简写为JS)接口,供Web应用调用。
在现有技术中,如果要将本地组件扩展为JavaScript接口,需要在浏览器内核中将DOM(DocumentObjectModel,文档对象模型)模块扩展为DOM对象,然后将扩展的DOM对象注册给JavaScript引擎,扩展为对应的JavaScript对象。当JavaScript引擎解析JavaScript脚本时,调用JavaScript对象,然后通过DOM对象间接调用本地组件。
现有的在浏览器内核中扩展JavaScript对象的方法,需要编译Android系统的C++层浏览器内核源码,执行效率低;而且对于Android的不同版本,在浏览器内核中扩展的方案需要在不同的Android版本的源码中实现,通用性差,代码维护成本高。
发明内容
本发明的目的在于克服目前在Android系统浏览器内核中扩展JavaScript对象的方法中,存在的代码通用性差、维护成本高的缺陷,提供了一种扩展JavaScript对象的方法。
为了实现上述目的,本发明提供了一种扩展JavaScript对象的方法,包括:
步骤1)页面调用JavaScript对象,并将调用请求通过JavaScript层的自定义对象,Java层的对象,JNI的对象传递到C++层的对象;
步骤2)C++层的对象根据请求调用本地组件进行异步处理;
步骤3)当本地组件异步处理结束之后,返回回调消息;
步骤4)C++层对象将回调的消息内容封装为JSON格式,通过socket客户端发送;
步骤5)在Java层,socket服务端接收消息,并把消息放在当前显示的WebView中的消息队列中;
步骤6)JavaScript层的自定义对象定时从消息队列中取出消息;
步骤7)触发JavaScript对象的事件,将消息以事件的形式通知页面。
上述技术方案中,在所述步骤1)之前,对C++层,JNI层,Java层,JavaScript层的对象及其数据格式进行定义,包括:
步骤101)将C++层的对象封装为JSON格式;
步骤102)通过JNI将JSON格式的C++层的对象封装为Java对象;
步骤103)在WebView中基于Java对象注册自定义JavaScript对象;
步骤104)将JSON格式的自定义JavaScript对象转换为JavaScript对象。
上述技术方案中,所述步骤1)还包括:
在JavaScript对象中声明handlers属性,并实现addEventListener,removeEventListener和fireEvent这三个函数;将JavaScript对象事件命名为onPlay;页面调用JavaScript对象的addEventListener函数注册onPlay事件监听函数。
上述技术方案中,所述步骤5)中的消息队列为栈结构。
本发明的优点在于:
1、本发明的方法可以有效地解决本地组件和JavaScript对象之间的异步调用问题,相比于现有的在浏览器内核中扩展JavaScript对象的方法,本发明的方法不需要编译Android系统的C++层内核源码,提高了开发效率;
2、本发明的方法一次实现可以在多个Android版本中使用,通用性好。
附图说明
图1为本发明的扩展JavaScript对象的方法的示意图;
图2为本发明的各层对象的数据传递关系图;
图3为本发明的WebView和TVSEOTT的栈的示意图。
具体实施方式
在Android系统的应用开发框架中,为开发者提供了WebView组件。WebView是基于WebKit内核的浏览器组件,WebKit是用C++开发的浏览器内核,在Android系统中作为第三方库,WebKit是网页的布局和渲染引擎,将HTML/CSS/JavaScript脚本渲染为可见的页面,WebView是WebKit的Java层视图类。通过WebView组件,可以在Android应用程序中实现Web浏览功能,处理网络请求,显示页面。WebView提供了addJavascriptInterface接口,可以将Java对象注册到WebView中,在页面中可以通过JavaScript对象调用Java对象。但是如果要让JavaScript能够调用C++组件的接口,还需要完成Java和C++的相互调用。
在Android系统中,可以实现Java和C++的相互调用。AndroidNDK(NativeDevelopmentKit)是一套工具集合,允许使用C/C++语言实现应用程序的一部分,适用于开发的应中需要调用C++库这种情况。在Android的NDK开发中,需要通过JNI(JavaNativeInterface,Java本地接口)来实现Java和C++代码的互相调用。JNI支持Java和C/C++代码进行交互,并且有自己的原始数据类型和数据引用类型。
为了方便在C++层,Java层和JavaScript层之间测参数传递,在C++层做一层适配,将第三方库的返回结果封装为JSON(JavaScriptObjectNotation)字符串形式。JSON是一种轻量级的数据交换格式,用于描述数据结构,形式包括:对象,名称/值,值的有序列表,字符串,数值和布尔值。这种做法有如下两个好处,一是方便通过JNI的jstring类型传递参数;二是方便在JavaScript中通过eval函数来解析,还原为JavaScript对象。
在JavaScript层中,为了给Web开发者提供JavaScriptAPI,需要在JavaScript层将从Java层获取的JSON格式返回值转换为JavaScript对象,然后将对象的属性和方法进行封装,并提供事件机制。
实现本地组件和JavaScript对象的异步调用是一个难点,利用DOM事件模型,可以为JavaScript对象扩展自定义事件,实现与本地组件之间的异步调用。
DOM事件模型可以分为DOM0级别和DOM2级别两种类型。在DOM0级别的事件模型中,事件被注册为HTML元素的一个属性。例如button元素的onclick事件,假设btn是一个button元素,则通过代码:btn.onclick=function()即可注册button的onclick事件,当按钮被鼠标单击时,就会调用监听函数,做出响应。DOM0级别的事件功能简单,使用方便。所有支持JavaScript的浏览器都支持DOM0级别的事件。
DOM2级别的事件模型,有两个主要的方法:addEventListener方法用于注册某个事件的监听函数,removeEventListener方法用于删除某个事件的监听函数,所有的DOM2节点都包含这两个方法。相比于DOM0级别的事件模型,DOM2级别事件模型功能强大,Chrome,Firefox,IE9等主流的浏览器都支持DOM2级别的DOM事件模型。
DOM中的事件模型是在浏览器内核中实现的,当JavaScript和DOM进行交互时,可以使用浏览器内部的事件处理机制,当JavaScript对象不是DOM元素时,需要在自定义的JavaScript对象中扩展事件机制。
本发明的方法基于AndroidNDK,将本地组件扩展为JavaScript接口,供上层页面调用。JavaScript调用本地组件时,可以通过同步调用和异步调用,在解决本地组件和JavaScript接口异步调用问题时,采用socket传递并在JavaScript层中定时取出消息,封装为JavaScript事件方式进行支持。
下面结合附图和具体实施例对本发明的方法做进一步的说明。
本实施例为:将本地C++动态库组件通过异步调用扩展为JavaScript对象,实现多源媒体聚合功能扩展。
如图1所示,一种扩展JavaScript对象的方法,包括:
步骤1)页面调用JavaScript对象,并将调用请求通过JavaScript层的自定义对象,Java层的对象,JNI的对象传递到C++层的对象;
如图2所示,在所述步骤1)之前,对C++层,JNI层,Java层,JavaScript层的对象及其数据格式进行定义,包括:
步骤101)将C++层的对象封装为JSON格式;
C++层的主要工作是对第三方库的返回结果做封装和适配,便于参数的传递和JavaScript层的处理。
将C++的对象定义为OTTVideo,对象OTTVideo可调用本地功能组件,通过开源库jsoncpp将第三方库的返回值封装为JSON格式,以字符串的形式返回,供JNI调用。
步骤102)通过JNI将JSON格式的C++层的对象封装为Java对象;
将Java层对象定义为TVSEOTT,将TVSEOTT对象调用的C++的方法声明为native方法。在JNI的OTTVideoJni.cpp中实现TVSEOTT.java中的native方法,这需要实现Java方法和native方法的映射表,注册给Java虚拟机(JVM),这样JVM就可以通过函数映射表来调用相应的函数,Java与JNI通过JNINativeMethod(在jni.h中定义)的结构来建立联系。
在OTTVideoJni.cpp中调用OTTVideo中的方法,完成对第三方库的调用。将OTTVideoJni.cpp,OTTVideo和第三方库打包为动态库,在TVSEOTT中通过System.loadLibrary方法加载到内存中,这样通过JNI可以实现Java层的TVSEOTT到C++层的OTTVideo的调用。
步骤103)在WebView中基于Java对象注册自定义JavaScript对象;
在WebView中通过addJavascriptInterface方法,将TVSEOTT对象注册为自定义JavaScript对象,对象名为ottvideo_js,这样在JavaScript中可以使用ottvideo_js调用C++层代码。
步骤104)将JSON格式的自定义JavaScript对象转换为JavaScript对象;
自定义JavaScript对象ottvideo_js调用C++层代码,返回结果为JSON格式的字符串,不能直接使用;在JavaScript层将需要扩展的多源媒体聚合的JavaScript对象定义为ottvideo,它调用ottvideo_js获取结果,然后通过JavaScript层的eval函数将JSON格式的字符串转化为JavaScript对象。
在JavaScript对象ottvideo声明handlers属性,并实现addEventListener,removeEventListener和fireEvent这三个函数。将JavaScript对象事件命名为onPlay。
页面调用ottvideo对象的addEventListener函数注册onPlay事件监听函数。当页面请求视频的播放连接时,将请求依次通过JavaScript层中的ottvideo,ottvideo_js,Java层的TVSEOTT,JNI中的OTTVideoJni传递到C++层的OTTVideo。
步骤2)C++层的对象根据请求调用本地组件进行异步处理;
步骤3)当本地组件异步处理结束之后,返回回调消息;
步骤4)C++层对象将回调的消息内容封装为JSON格式,通过socket客户端发送;
在OTTVideo中,当被第三方库回调时,C++层的对象将回调的消息内容封装为JSON格式,通过socket客户端发送;
步骤5)在Java层,socket服务端接收消息,并把消息放在当前显示的WebView中的消息队列中;
如图3所示,在Java层实现socket服务端,接收C++层socket客户端发来的消息。在应用中,可能打开多个WebView窗口,每个WebView窗口都包含一个TVSEOTT的Java对象,所以要将底层C++传来的消息发送给优先级高的WebView中的TVSEOTT的对象,这就需要建立一个元素为<WebView,TVSEOTT>的栈,每次调用栈顶WebView的TVSEOTT对象的setMessage,将C++回调的消息传给当前显示的WebView的TVSEOTT对象,并在TVSEOTT内部维护消息队列,存放消息。
步骤6)JavaScript层的自定义对象定时从消息队列中取出消息;
在TVSEOTT中定义getMessage方法,返回JSON格式的消息;在ottvideo_js对象中通过setInterval方法,定时从TVSEOTT中通过调用其getMessage取出消息;
步骤7)触发JavaScript对象的事件,将消息以事件的形式通知页面。
在JavaScript层ottvideo对象调用ottvideo_js获取结果,然后通过JavaScript的eval函数将JSON格式的字符串转化为JavaScript对象。
调用函数fireEvent触发ottvideo中onPlay事件,并调用响应的监听函数做对onPlay事件的处理工作,将消息以事件的形式通知页面。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。

Claims (4)

1.一种扩展JavaScript对象的方法,所述方法包括:
步骤1)页面调用JavaScript对象,并将调用请求通过JavaScript层的自定义对象,Java层的对象,JNI的对象传递到C++层的对象;
步骤2)C++层的对象根据请求调用本地组件进行异步处理;
步骤3)当本地组件异步处理结束之后,返回回调消息;
步骤4)C++层对象将回调的消息内容封装为JSON格式,通过socket客户端发送;
步骤5)在Java层,socket服务端接收消息,并把消息放在当前显示的WebView中的消息队列中;
步骤6)JavaScript层的自定义对象定时从消息队列中取出消息;
步骤7)触发JavaScript对象的事件,将消息以事件的形式通知页面。
2.根据权利要求1所述的扩展JavaScript对象的方法,其特征在于,在所述步骤1)之前,对C++层,JNI层,Java层,JavaScript层的对象及其数据格式进行定义,包括:
步骤101)将C++层的对象封装为JSON格式;
步骤102)通过JNI将JSON格式的C++层的对象封装为Java对象;
步骤103)在WebView中基于Java对象注册自定义JavaScript对象;
步骤104)将JSON格式的自定义JavaScript对象转换为JavaScript对象。
3.根据权利要求1所述的扩展JavaScript对象的方法,其特征在于,所述步骤1)还包括:
在JavaScript对象中声明handlers属性,并实现addEventListener,removeEventListener和fireEvent这三个函数;将JavaScript对象事件命名为onPlay;页面调用JavaScript对象的addEventListener函数注册onPlay事件监听函数。
4.根据权利要求1所述的扩展JavaScript对象的方法,其特征在于,所述步骤5)中的消息队列为栈结构。
CN201410768954.7A 2014-12-11 2014-12-11 一种扩展JavaScript对象方法 Expired - Fee Related CN105743955B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410768954.7A CN105743955B (zh) 2014-12-11 2014-12-11 一种扩展JavaScript对象方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410768954.7A CN105743955B (zh) 2014-12-11 2014-12-11 一种扩展JavaScript对象方法

Publications (2)

Publication Number Publication Date
CN105743955A true CN105743955A (zh) 2016-07-06
CN105743955B CN105743955B (zh) 2018-11-13

Family

ID=56240855

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410768954.7A Expired - Fee Related CN105743955B (zh) 2014-12-11 2014-12-11 一种扩展JavaScript对象方法

Country Status (1)

Country Link
CN (1) CN105743955B (zh)

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109032583A (zh) * 2018-07-25 2018-12-18 北京小米移动软件有限公司 数据交互方法及装置
CN109460237A (zh) * 2018-10-25 2019-03-12 北京顶象技术有限公司 代码的编译方法及装置
CN109634549A (zh) * 2018-10-23 2019-04-16 中国平安人寿保险股份有限公司 音频播放方法、音频播放器、计算机装置及可读存储介质
CN109831701A (zh) * 2019-01-28 2019-05-31 四川长虹电器股份有限公司 数字电视设备浏览器以及跨页面系统事件的扩展方法
CN110851240A (zh) * 2019-11-18 2020-02-28 北京小米移动软件有限公司 功能调用方法、装置及存储介质
CN111506853A (zh) * 2020-04-23 2020-08-07 山东旗帜信息有限公司 一种webview页面处理方法及装置
CN111966427A (zh) * 2020-08-17 2020-11-20 四川长虹电器股份有限公司 一种Android native调用Java API的实现方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102830959A (zh) * 2011-06-16 2012-12-19 中国科学院声学研究所 一种嵌入式浏览器接口动态扩展方法及系统
CN103064667A (zh) * 2012-12-06 2013-04-24 郑州威科姆科技股份有限公司 一种基于JavaScript扩展控制硬件设备的方法
CN103309660A (zh) * 2013-05-27 2013-09-18 北京尚友通达信息技术有限公司 移动应用跨平台开发方法
US20140280515A1 (en) * 2013-03-15 2014-09-18 Yottaa Inc. System and method for managing multiple variants of an http object

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102830959A (zh) * 2011-06-16 2012-12-19 中国科学院声学研究所 一种嵌入式浏览器接口动态扩展方法及系统
CN103064667A (zh) * 2012-12-06 2013-04-24 郑州威科姆科技股份有限公司 一种基于JavaScript扩展控制硬件设备的方法
US20140280515A1 (en) * 2013-03-15 2014-09-18 Yottaa Inc. System and method for managing multiple variants of an http object
CN103309660A (zh) * 2013-05-27 2013-09-18 北京尚友通达信息技术有限公司 移动应用跨平台开发方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
刘春梅 等: "基于JavaScript引擎的终端动态数据处理方法", 《微计算机应用》 *
李张永 等: "跨平台移动Web开发框架与数据交互方法", 《计算机工程与设计》 *

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109032583A (zh) * 2018-07-25 2018-12-18 北京小米移动软件有限公司 数据交互方法及装置
CN109032583B (zh) * 2018-07-25 2022-06-17 北京小米移动软件有限公司 数据交互方法及装置
CN109634549A (zh) * 2018-10-23 2019-04-16 中国平安人寿保险股份有限公司 音频播放方法、音频播放器、计算机装置及可读存储介质
CN109460237A (zh) * 2018-10-25 2019-03-12 北京顶象技术有限公司 代码的编译方法及装置
CN109831701A (zh) * 2019-01-28 2019-05-31 四川长虹电器股份有限公司 数字电视设备浏览器以及跨页面系统事件的扩展方法
CN109831701B (zh) * 2019-01-28 2021-12-21 四川长虹电器股份有限公司 数字电视设备浏览器以及跨页面系统事件的扩展方法
CN110851240A (zh) * 2019-11-18 2020-02-28 北京小米移动软件有限公司 功能调用方法、装置及存储介质
CN110851240B (zh) * 2019-11-18 2022-04-29 北京小米移动软件有限公司 功能调用方法、装置及存储介质
CN111506853A (zh) * 2020-04-23 2020-08-07 山东旗帜信息有限公司 一种webview页面处理方法及装置
CN111506853B (zh) * 2020-04-23 2024-01-19 山东旗帜信息有限公司 一种webview页面处理方法及装置
CN111966427A (zh) * 2020-08-17 2020-11-20 四川长虹电器股份有限公司 一种Android native调用Java API的实现方法
CN111966427B (zh) * 2020-08-17 2022-06-21 四川长虹电器股份有限公司 一种Android native调用Java API的实现方法

Also Published As

Publication number Publication date
CN105743955B (zh) 2018-11-13

Similar Documents

Publication Publication Date Title
CN105743955A (zh) 一种扩展JavaScript对象方法
CN109002362B (zh) 一种服务方法、装置、系统以及电子设备
KR102436987B1 (ko) 웹페이지 콘텐츠를 추출하기 위한 방법 및 단말 장치
WO2018072626A1 (zh) 组件调用的方法和装置、组件数据处理的方法和装置
KR102105261B1 (ko) 인터페이스 데이터 디스플레이 방법 및 장치
US9448776B1 (en) Method and apparatus for converting a website into a native mobile application
US8966508B2 (en) Method for executing hybrid web application and apparatus therefor
CN108572965B (zh) 一种资源加载方法及装置
US10346501B2 (en) Mobile enablement of existing web sites
CN109388766A (zh) 页面加载的方法和装置
CN111090431B (zh) 一种数据处理方法及装置
CN102880708B (zh) 用于实现html页面的可视化设计的系统和方法
CN112579118B (zh) 微服务的配置信息更新方法、装置、系统、介质和设备
CN106020823A (zh) 一种前端Web表现与数据分离以及页面快速响应的方式
US20150143348A1 (en) Hybrid dynamic code compiling device, method, and service system thereof
CN107450928B (zh) 一种基于缓存技术的混合开发方法
CN108170430B (zh) 一种界面展示的方法及系统
CN110806868A (zh) 一种单页面搭建及加载方法
CN115934855A (zh) 一种全链路字段级血缘解析方法、系统、设备及存储介质
US9292252B2 (en) Methods and apparatus for voiced-enabling a web application
WO2023082654A1 (zh) 一种业务交互图生成方法、装置、设备及存储介质
CN111857658A (zh) 一种渲染动态组件的方法、装置、介质和电子设备
CN110069247A (zh) 一种应用程序的开发方法及装置、使用方法及装置
CN102981845A (zh) 浏览器进行页面元素处理的方法及装置
CN113360385A (zh) 一种测试方法、装置、设备及介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20181113

CF01 Termination of patent right due to non-payment of annual fee