CN108376066B - 代码处理装置及代码处理方法 - Google Patents

代码处理装置及代码处理方法 Download PDF

Info

Publication number
CN108376066B
CN108376066B CN201611051637.9A CN201611051637A CN108376066B CN 108376066 B CN108376066 B CN 108376066B CN 201611051637 A CN201611051637 A CN 201611051637A CN 108376066 B CN108376066 B CN 108376066B
Authority
CN
China
Prior art keywords
code
layer
class
java
calling
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.)
Active
Application number
CN201611051637.9A
Other languages
English (en)
Other versions
CN108376066A (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201611051637.9A priority Critical patent/CN108376066B/zh
Publication of CN108376066A publication Critical patent/CN108376066A/zh
Application granted granted Critical
Publication of CN108376066B publication Critical patent/CN108376066B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种代码处理装置及代码处理方法;装置包括:第一代码层;第二代码层;中间层,与第一代码层以及第二代码层耦合;第一代码层,基于在虚拟机的宿主环境中运行的第一代码实现,包括代码处理装置中安装的应用,用于向中间层调用由第二代码形成的第二代码方法;中间层,基于第二代码实现,用于连接第一代码层和第二代码层,响应针对第二代码方法的调用,向第二代码层调用第二代码方法;第二代码层,基于能够在特定处理器上直接编译运行的第二代码实现,用于向中间层调用由第二代码形成的第二代码方法;响应中间层针对第二代码方法的调用,执行第一代码方法。实施本发明,能够简化代码的调用所实现方法的调用逻辑,降低代码维护难度。

Description

代码处理装置及代码处理方法
技术领域
本发明涉及计算机技术,尤其涉及一种代码处理装置及代码处理方法。
背景技术
互联网特别移动互联网快速发展,智能手机、平板电脑等终端作为互联网访问互联网的入口而得到广泛使用,终端提供种类丰富的应用供用户选择、安装使用,而应用的代码使用的计算机语言往往与终端的操作系统代码所使用的用的计算机语言不同。以安卓(Android)系统的终端为例,安卓系统中安装的应用是基于Java代码实现,而安卓系统是基于C/C++代码实现。
由于Java代码是基于Java虚拟机的宿主环境中运行,能够轻易地在不同处理器的终端中运行,对于开发者来说,可以忽略终端的处理器平台导致的差异而专注于应用自身功能的开发,提升应用的开发效率。
使用Java代码开发应用时并不能满足全部开发需求,为了提高应用的开发效率,或者实现Java代码所不具有的功能,需要在应用的Java代码中调用安卓系统的本地代码(对于安卓系统来说,本地代码为C/C++代码)所实现的方法,也称为调用本地(Native)方法。Java平台提供了Java本地接口(JNI,Java Native Interface),用以支持在应用的Java代码中调用Native方法。
同时,为了满足在本地代码中实现某些Java方法的功能,在本地代码中也存在调用Java方法的需求,为此,Java本地接口还支持在安卓系统的本地代码中反向调用Java方法,从而,实现Java代码和本地代码的互通。
然而,为了实现Java代码和本地代码的互通,对于本地代码来说,不仅要响应来自Java代码的调用,还要响应来自安卓系统本地的调用,导致代码的调用逻辑复杂化,进而导致代码维护困难。
综上所述,对于终端中存在两类代码的实现时,如何简化不同代码之间的调用逻辑,降低代码维护难度,相关技术尚无有效解决方案。
发明内容
本发明实施例提供一种代码处理装置及代码处理方法,能够简化代码的调用所实现方法的调用逻辑,降低代码维护难度。
本发明实施例的技术方案是这样实现的:
第一方面,本发明实施例提供一种代码处理装置:
第一代码层;第二代码层;中间层,与所述第一代码层耦合,并与所述第二代码层耦合;其中,
所述第一代码层,基于在虚拟机的宿主环境中运行的第一代码实现,包括所述代码处理装置中安装的应用,用于向所述中间层调用由第二代码形成的第二代码方法;
所述中间层,基于所述第二代码实现,用于连接所述第一代码层和所述第二代码层,响应针对所述第二代码方法的调用,向所述第二代码层调用所述第二代码方法;
所述第二代码层,基于能够在特定处理器上直接编译运行的所述第二代码实现,用于向所述中间层调用由所述第二代码形成的所述第二代码方法;以及,响应所述中间层针对所述第二代码方法的调用,执行所述第二代码方法。
第二方面,本发明实施例提供一种代码处理方法,包括:
中间层与第一代码层耦合,并与第二代码层耦合;
其中,所述第一代码层基于在虚拟机的宿主环境中运行的第一代码实现,包括安装的应用;所述第二代码层基于能够在特定处理器上直接编译运行的第二代码实现;所述中间层基于所述第二代码实现;
所述第一代码层向中间层调用由所述第二代码形成的第二代码方法;
所述中间层连接所述第一代码层和所述第二代码层,响应针对所述第二代码方法的调用,向所述第二代码层调用所述第二代码方法;
所述第二代码层向所述中间层调用由所述第二代码形成的所述第二代码方法;以及,响应所述中间层针对所述第二代码方法的调用,执行所述第二代码方法。
第三方面,本发明实施例提供一种代码处理装置,包括存储器和处理器;所述存储器中存储有可执行指令,所述可执行指令用于引起处理器执行以下的操作:
中间层与第一代码层耦合,并与第二代码层耦合;
其中,所述第一代码层基于在虚拟机的宿主环境中运行的第一代码实现,包括安装的应用;所述第二代码层基于能够在特定处理器上直接编译运行的第二代码实现;所述中间层基于所述第二代码实现;
所述第一代码层向中间层调用由所述第二代码形成的第二代码方法;
所述中间层连接所述第一代码层和所述第二代码层,响应针对所述第二代码方法的调用,向所述第二代码层调用所述第二代码方法;
所述第二代码层向所述中间层调用由所述第二代码形成的所述第二代码方法;以及,响应所述中间层针对所述第二代码方法的调用,执行所述第二代码方法。
第四方面,本发明实施例提供一种存储介质,存储有可执行指令,用于执行本发明实施例提供的代码处理方法。
本发明实施例具有以下有益效果:
通过在第一代码层和第二代码层中设置中间层,利用中间层对第二代码方法的调用进行接管,第二代码层仅是用于响应来自中间层的第二代码方法调用,而不会区分执行用于实现第二代码方法的功能的逻辑是由来自第一代码层的调用导致的,还是由来自第二代码层的内部调用导致的,从而将第二代码方法的调用相关的逻辑与执行用于实现第二代码方法的逻辑进行解耦,使代码的框架结构简明清晰,第二代码方法的代码复用性更高,便于后期的维护管理。
附图说明
图1是本发明实施例提供的运行安卓系统的终端的软硬件架构的一个可选的结构示意图;
图2是本发明实施例提供的对图1示出的终端软件架构进行抽象表示的示意图;
图3是本发明实施例提供的基于Java本地接口实现Java代码和Native代码之间互访的一个可选的实现示意图;
图4是本发明实施例提供的代码处理装置的软件结构的一个可选的结构示意图;
图5-1是本发明实施例提供的代码处理装置的另一个可选的结构示意图;
图5-2是本发明实施例提供的第一代码层、中间层和第二代码层之间方法调用的一个可选的示意图;
图6是本发明实施例提供的代码处理方法的一个可选的流程示意图;
图7为本发明实施例提供的Java层调用C系实现层的C++方法的一个可选的流程示意图。
具体实施方式
以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所提供的实施例仅仅用以解释本发明,并不用于限定本发明。另外,以下所提供的实施例是用于实施本发明的部分实施例,而非提供实施本发明的全部实施例,在本领域技术人员不付出创造性劳动的前提下,对以下实施例的技术方案进行重组所得的实施例、以及基于对发明所实施的其他实施例均属于本发明的保护范围。
需要说明的是,在本发明实施例中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的方法或者装置不仅包括所明确记载的要素,而且还包括没有明确列出的其他要素,或者是还包括为实施方法或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的方法或者装置中还存在另外的相关要素(例如方法中的步骤或者装置中的单元)。
例如,本发明实施例提供的代码处理方法包含了一系列的步骤,但是本发明实施例提供的代码处理方法不限于所记载的步骤,同样地,本发明实施例提供的代码处理装置包括了一系列单元,但是本发明实施例提供的代码处理装置不限于包括所明确记载的单元,还可以包括为获取相关信息、或基于信息进行处理时所需要设置的单元。
对本发明进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
1)本地代码(Native Code),与设备的操作系统相关,是指用于实现操作系统底层的内核和库的代码。
以安卓系统为例,本地代码是使用计算机语言如C系语言(包括C/C++语言)编写的代码,用来在设备的处理器(如英特尔x86级的处理器)上运行,由于是针对处理器编写形成的,因此编译后执行时具备良好的执行效率。
2)本地(Native)方法(函数),是指对实现某特定功能(如图形处理、数据库或任意的扩展功能)的一系列的本地代码,本地方法与处理器相关,因此依赖特定的平台执行。本地方法以库文件的方式存储,以安卓系统为例,C/C++代码实现的本地方法存储于C/C++类库中。
3)Java代码,基于Java虚拟机(JVM,Java Virtual Machine)的宿主环境(HostEnvironment)中运行的、与处理器无关的代码。
4)Java方法(函数),是指实现特定功能的一系列的Java代码,用于在Java虚拟机中运行,Java方法与处理器无关而具有跨平台执行特性,Java方法以库文件的方式存储于Java虚拟机的类库中。
5)Java类,包括Java方法和属性,Java方法用于定义Java类的某种行为或功能,属性用于描述对象用于定义类或类的实例所包括的数据。
6)Java本地接口(JNI,Java Native Interface),一个或一系列的应用程序接口(API,Application Program Interface),实现Java代码和Native代码(包括如前述的C系代码、以及任意的约定支持的类型的代码)之间的通信,通信的方式主要包括:
6.1)在Java代码中通过Java本地接口调用Native方法;
6.2)在本Native代码中通过Java本地接口调用Java方法;
在Native代码中链接Java虚拟机的本地库,从而能够使用Java本地接口在Java虚拟机的宿主环境中执行Java方法。例如,一个基于C代码实现的浏览器可以在一个嵌入式Java虚拟机中执行从网上下载的小应用程序(applets)。
以代码处理装置实施为终端为例,参见图1,图1为本发明实施例提供的运行安卓系统的终端的软硬件架构的一个可选的结构示意图,包括应用、应用框架、库、库中的运行时(Runtime)库、内核和硬件层几个主要结构,分别进行说明。
1)应用,安卓系统的应用包括电子邮件端、日历、地图、浏览器、联系人和其他设置等,所有应用都是Java代码实现,运行于在基于Java虚拟机的宿主环境中。
2)应用框架,提供开放的开发平台,支持应用访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等多。应用框架结构旨在简化组件的重用,任何应用都能在应用框架中发布所具有的功能供其他应用使用(在服从应用框架执行安全限制的前提下),应用框架基于Java代码实现,运行于在基于Java虚拟机的宿主环境中。
应用框架层提供一系列的服务和系统,示例性地,包括:
视图(View)系统,可扩展的视图集合,可用于构建一个应用,包括列表、网格、文本框和按钮,甚至是内嵌的网页浏览器;
内容提供者(Content Providers),使应用能访问其他应用(如通讯录)的数据,或共享应用自身的数据;
资源管理器(Resource Manager),提供访问非代码资源,如本地化字符串、图形和布局文件;
通知管理器(Notification Manager)、支持应用能够在状态栏显示自定义的通知;
活动管理器(Activity Manager),管理应用生命周期,提供通用的导航回退功能;
定位管理器(Location Manager),管理应用使用设备实时位置的权限。
3)库,C/C++库的集合,能通过应用框架向开发者提供,示例性地,包括:
系统C库,标准C系统库(Libc)的BSD衍生,调整为基于嵌入式Linux的设备;
媒体库,多媒体核心(OpenCORE),支持播放和录制多种的音频和视频格式以及静态图像文件,包括MPEG4、H.264、MP3、AAC、AMR和JPG等格式;
PNG界面管理,管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层;
WEB浏览器引擎,驱动浏览器和内嵌的网络(WEB)视图;
图形引擎(SGL),基本的2D图形引擎3D库,使用硬件3D加速或包含高度优化的3D软件光栅;
字体引擎(FreeType),负责位图和矢量字体渲染;
SQLite,应用都可以使用的轻量级的关系数据库引擎。
4)Runtime库是一个核心库的集合,基于C/C++代码实现,提供大部分Java语言的核心类库中可用的功能。每一个应用都是Dalvik虚拟机(Java虚拟机)中的实例,运行于实例自身的进程中。Dalvik虚拟机(Java虚拟机)支持在一个设备(如各种终端)中高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是“dex”,dex格式是用于Dalvik虚拟机中的压缩格式,适合内存和处理器速度有限的设备,节约资源占用。
Dalvik虚拟机基于寄存器运行,运行依赖于内核提供的基本功能,如线程和底层内存管理。
5)内核,基于C/C++代码实现,核心系统服务。例如:安全、内存管理、进程管理、网络、堆栈和驱动模型。内核作为硬件和应用之间的抽象层,隐藏不同设备的硬件细节,从而屏蔽硬件的差异,为上层的应用、应用框架提供统一的服务。当底层的硬件发生变化时,不会影响到上层的应用和应用框架。
6)硬件,包括代码处理装置的基本硬件,如:处理器、输入/输出接口,存储介质以及网络接口,组件可以经系统总线连接通信。
处理器可以采用中央处理器(CPU)、微处理器(MCU,Microcontroller Unit)、专用集成电路(ASIC,Application Specific Integrated Circuit)或逻辑可编程门阵列(FPGA,Field-Programmable Gate Array)实现。
输入/输出接口可以采用如显示屏、触摸屏、扬声器等输入/输出器件实现。
存储介质可以采用闪存、硬盘、光盘等非易失性存储介质实现,也可以采用双倍率(DDR,Double Data Rate)动态缓存等易失性存储介质实现,其中存储有用以执行上述代码处理方法的可执行指令。
示例性地,存储介质可以与代码处理装置的其他组件在同一位置(如用户侧终端)设置,也可以相对于代码处理装置中的其他组件分布设置。网络接口向处理器提供外部数据如异地设置的存储介质的访问能力,示例性地,网络接口可以基于近场通信(NFC,NearField Communication)技术、蓝牙(Bluetooth)技术、紫蜂(ZigBee)技术进行的近距离通信,另外,还可以实现如基于码分多址(CDMA,Code Division Multiple Access)、宽带码分多址(WCDMA,Wideband Code Division Multiple Access)等通信制式及其演进制式的蜂窝通信,又例如,基于无线相容性认证(WiFi)方式经由接入无线接入点(AP,Access Point)接入网络侧的通信。
参见图2,图2是本发明实施例提供的对图1示出的终端软件架构进行抽象表示的示意图,基于Java代码实现的应用运行于基于Java虚拟机的宿主环境中,Java本地接口使得Native代码可以与Java代码集成。
实际应用中,使用Java代码开发应用时并不能满足全部开发需求,比如希望提高某些关键模块的效率,或者必须使用一些高性能多线程的代码,比如图片功能,数据库功能,或者任意安卓系统中任意第三方的扩展(程序或者功能)时,Java本地接口能够支持在Java代码中调用基于Native方法(如基于C系代码实现的Native方法)。Java本地接口使得既可以利用Java语言跨平台、类库丰富和开发便捷等特点,又可以利用本地代码的高效的优点。
参见图3,基于图1和图2,图3是本发明实施例提供的基于Java本地接口实现Java代码和Native代码之间互访的一个可选的实现示意图,安卓Java层基于Java代码实现,包括安卓系统中的任意Java方法、应用和应用框架;安卓本地C系实现层包括安卓系统中基于C系代码实现的原生的或第三方的Native方法,如图1示出的基于C系代码实现的类库、以及库和内核等。
需要指出地,虽然图3是针对图1和图2是设备运行安卓系统、相应的本地代码为C系代码为例,对Java代码和Native代码之间互访的示例性说明,但是同样可以适用于对在安卓系统之外的系统中进行Java应用开发时,对Java代码和Native代码之间互访的示例性说明,例如,可以理解地,当设备运行非安卓系统且本地代码为非C系代码时,图3示出的安卓C系实现等替换为该系统的本地代码实现层,安卓Java层可以替换为相应系统的Java层。
Java本地接口是Java虚拟机实现中的一部分,参见图3所示,以Native代码为C系代码为例,Java本地接口是一个双向的接口:Java本地接口支持在Java代码中访问(调用)安卓本地C实现层中的Native方法,还可以在Native代码中嵌入一个Java虚拟机,并通过Java本地接口访问(返调用)安卓Java层的Java方法。
可见,Java本地接口担任了一个桥梁的角色,将Java虚拟机与Native方法联系起来,从而实现了Java代码与Native代码的互访。
但是,由于在Java层引入Native方法实现的功能时,要通过Java本地接口调用实现该功能的Native方法,并且在本地C系实现层执行与功能相关的逻辑操作,使安卓本地C系实现层代码的逻辑复杂,往往需要在安卓本地C系实现层的C接口中完成大量操作,容易出现因为操作不当造成异常情况,导致不稳定性。
针对上述问题,参见图4,图4是本发明实施例提供的代码处理装置的软件结构的一个可选的结构示意图,将图1所示的代码处理装置的软件层划分为三个层次,分别为:Java层、Native层和C系实现层,对于各层而言:
1)Java层,基于Java代码实现,包括代码处理装置运行的系统中任意基于Java代码的方法;Java层用用于通过Java本地接口,调用C系实现层的用于实现特定功能的Native方法,用于声明Java本地接口、以及针对Java本地接口的调用。
2)Native层,用于连接Java层与C系实现层;Native层持有C系实现层的对象引用和Java层的对象引用,从而既可以为Java层调用C系实现层的Native方法,也可支持C系实现层在Native代码中反向调用Java层的Java方法。
3)C系实现层,包括代码处理装置运行的如图1示出的任意基于C系代码实现的Native方法,包括如图1所示的基于C/C++的库函数和内核等;负责响应针对Native模块的调用,执行用于实现被调用的Native方法的功能的逻辑。
由于C系实现层仅是用于响应针对Native方法的调用,而不会区分执行用于实现Native方法的功能的逻辑是由来自Java层的调用导致的,还是由常规的C系调用导致的,从而将Native方法的调用相关的逻辑与执行用于实现Native方法的逻辑进行解耦,使软件的框架结构简明清晰,Native方法的代码复用性更高,便于后期的维护管理。
参见图5-1,图5-1是本发明实施例提供的代码处理装置的另一个可选的结构示意图,将代码处理装置的软件层划分为三个层次,分别为:第一代码层、第二代码层和中间层,对于各层次而言:
1)第一代码层,基于在虚拟机的宿主环境中运行的第一代码实现,包括代码处理装置中安装的应用。
以信息处理装置运行安卓系统为例,第一代码层可以为图4中示出的Java层,在软件结构上可以由图1示出的应用和应用框架构成,包括任意的由Java代码形成的方法。当然,第一代码也可为其他任意类型的基于虚拟机的宿主环境运行的代码,本发明实施例中对第一代码不做具体限定。
2)第二代码层,与信息处理装置的硬件层所采用的处理器相关,基于能够在特定处理器上直接编译运行的第二代码实现,由于第二代码能够被编译成直接供处理器执行的机器代码,因此执行效率高于基于虚拟机的宿主环境执行的第一代码。
接续前述第一代码层的示例,在图1中,第二代码为基于C/C++计算机语言编写形成的本地代码,第二代码层软件结构上包括由图1示出的由C/C++代码实现的内核和库文件实现。
当然,根据信息处理装置运行操作系统的差异,第二代码可以采用C/C++代码之外的其他类型的代码,本发明实施例中对第二代码不做限定。
3)中间层,基于第二代码实现,与第一代码层以及第二代码层耦合,实现了第一代码层和第二代码层之间的解耦的效果,从而能够简化方法的调用逻辑,下面就第一代码层向中间层调用第二代码层的方法(由第二代码形成,也称为第二代码方法)、第二代码层向中间层调用第二代码层的方法、以及第二代码层向中间层调用第一代码层的方法(由第一代码形成,也称为第一代码方法)的示例进行说明。
示例1)第一代码层向中间层请求调用第二代码层的第二代码方法
第一代码层为了实现第一代码方法所不具有的功能,或为了提升实现某功能的执行效率,向中间层调用由第二代码形成的实现相应功能的第二代码方法。
中间层基于与第一代码层的耦合、以及与第二代码层的耦合,建立连接第一代码层和第二代码层基于第二代码方法的连接关系,基于连接关系可以响应针对第二代码方法的调用,向第二代码层调用第二代码方法;
在一个实施例中,提供如下的方式建立连接第一代码层、中间层和第二代码层基于第二代码方法的连接关系,具体来说,通过在中间层和第二代码层进行初始化,将中间层初始化的第一代码类的对象第二代码类初始化的第二代码类的对象关联起来。
首先,第一代码层在向中间层调用第二代码方法之前,通过如下的方式在第一代码层封装本地声明有第二代码方法的第一代码类:在第一代码的源文件中,声明调用的第二代码方法所依赖的库的名称,并对所调用的第二代码方法进行本地声明,对第一代码的源文件进行编译形成封装有第一代码本地接口的第一代码类。在封装第一代码类之后,向中间层调用第一代码类的初始化方法。
其次,中间层响应第一代码层针对初始化方法的调用,对第一代码类在中间层对应的全局性数据进行静态初始化,包括初始化第一代码类的相关联域的标识;初始化第一代码类在中间层的全局性的数据;以及,初始化第一代码类相关方法的标识;另外,调用第二代码层中与第一代码类对应的第二代码类的静态初始化方法。
再次,第二代码层响应中间层针对第二代码类的静态初始化方法的调用,对第二代码层中与第一代码类相应的第二代码类进行静态初始化,包括初始化与第二代码类的全局变量、以及初始化第二代码类的静态成员变量,形成第二代码类的对象。
在另一个实施例中,在建立连接第一代码层、中间层和第二代码层基于第二代码方法的连接关系之后,中间层完成对与第一代码类的对象对应的第二代码类的对象的地址(对象引用)的持有,对于中间层完成对与第一代码类的对象对应的第二代码类的对象的地址(对象引用)的持有来说,提供如下的方式:
首先,第一代码层向中间层调用第一代码类的构造函数中的创建方法;其次,中间层响应针对创建方法的调用,在中间层创建与第一代码类相应的对象(中间对象)、以及与第一代码类对应的第二代码类,将中间对象的地址返回第一代码类的对象存储,调用初始化第二代码类的初始化方法;再次,第二代码层响应针对第二代码类的初始化方法,对第二代码类进行初始化,以及初始化第二代码类的成员变量和分配内存。
中间层在第一代码层调用第二代码方法时,通过持有的第一代码类的对象存储的中间对象的地址,获取到地址指向的第二代码类的对象的地址,根据获取到的第二代码类的对象的地址调用第二代码方法。
另外,中间层还根据第二代码方法返回的结果,如返回空值(void)或返回的带有信息或数值的结果,向第一代码层返回结果。
示例2)第二代码层向中间层请求调用第二代码层的第二代码方法
第二代码层向中间层调用第一代码层的方法,可见,第二代码层中的第二代码方法的调用可能是如示例1)记载的来自第一代码层,也可以是来自第一代码层的内部,由于针对第一代码层的调用的响应统一由中间层接管,中间层所根据第一代码层针对第一代码方法的调用,或者,第二代码层内部针对第二代码方法的调用,调用第一代码方法并向调用发起方返回(返回空值、信息或者数据)。
对于第一代码方法来说,不需要在第一代码方法实现区分不同调用者的内部逻辑,简化了第二代码方法的逻辑,对于开发者来说可以专注于第一代码方法自身功能的实现,
示例3)第二代码层向中间层请求反向调用第一代码层的第一代码方法
第二代码层向中间层反向调用由第一代码实现的第一代码方法,中间层响应反向调用,向第一代码层调用第一代码方法,第一代码层响应中间层针对第一代码方法的调用,执行第一代码方法。中间层根据调用的第一代码方法中包括的返回操作,向第二代码层返回(返回空值、信息或者数据)。
参见图5-2,图5-2是本发明实施例提供的第一代码层、中间层和第二代码层之间方法调用的一个可选的示意图。第一代码层包括有第一代码(如Java代码)实现的直播应用和浏览器,第二代码层包括有C/C++代码实现的定位功能和指南针功能。
直播应用启动时需要定位用户,向中间层请求调用定位功能,中间层调用定位功能,定位功能根据中间层的调用定位并返回定位结果,中间层向直播应用返回定位结果供直播应用呈现与定位结果相关的内容。
指南针需要根据定位结果精确确定方向,向中间层请求调用定位功能,中间层调用定位功能,定位功能根据中间层的调用定位并向指南针功能返回定位结果以计算方向。
对于定位功能来说,仅对来自中间层的调用进行响应,不需要区分调用是来自第一代码层的地图应用还是来自第二代码层的指南针功能而进行针对想的处理,也就是说对于定位功能来说不需要针对不同的调用发起者实现复杂的调用逻辑,简化了定位功能的调用进行响应的逻辑,对于开发者来说,也方便后续对定位功能的代码维护。
另外,对于定位功能来说,如果用户在使用的过程中需要查看所定位位置的地图,则定位功能向中间层发起针对地图应用的调用,将定位结果作为参数传递给地图应用,供地图应用加载相应位置的地图,这样,通过设置中间层,不仅能够实现第一代码层、以及第二代码层对第二代码层中的第二代码方法进行调用,也能够响应第二代码层对第一代码层的第一代码方法进行调用,实现了在简化调用逻辑的前提下不同代码层互通的效果。
与图5-1对应地,参见图6,图6是本发明实施例提供的代码处理方法的一个可选的流程示意图,包括以下步骤:
步骤101,中间层与第一代码层以及第二代码层耦合。
第一代码层基于在虚拟机的宿主环境中运行的第一代码实现,包括代码处理方法中安装的应用;第二代码层基于能够在特定处理器上直接编译运行的第二代码实现;中间层基于第二代码实现。
步骤102,第一代码层向中间层调用由第二代码形成的第二代码方法。
步骤103,中间层连接第一代码层和第二代码层,响应针对第二代码方法的调用,向第二代码层调用第二代码方法。
步骤104,第二代码层向中间层调用由第二代码形成的第二代码方法;以及,响应中间层针对第二代码方法的调用,执行第二代码方法。
另外,中间层在第一代码方法包括返回操作时,可以向调用第一代码方法的第一代码层以及第二代码层返回结果,如返回空值、信息和数值等。
在另一个实施例中,基于图6,还包括以下步骤:
步骤105,第二代码层向中间层反向调用由第一代码实现的第一代码方法。
步骤106,中间层向第一代码层调用第一代码方法。
在一个实施例中,第一代码层在向中间层调用第二代码方法之前,提供如下的方式建立连接第一代码层、中间层和第二代码层基于第二代码方法的连接关系:
第一代码层封装本地声明有第二代码方法的第一代码类,调用第一代码类的初始化方法:
中间层响应第一代码层针对初始化方法的调用,对第一代码类在中间层对应的全局性数据进行静态初始化,初始化第一代码类的相关联的域的标识;初始化第一代码类在中间层的全局性的数据,初始化第一代码类相关方法的标识,从而形成第一代码类的对象,并调用与第一代码类对应的第二代码类的静态初始化方法;
第二代码层响应中间层针对静态初始化方法的调用,对第二代码层中第二代码类进行静态初始化,包括在第二代码层初始化与第二代码类的全局变量、以及初始化第二代码类的静态成员变量,初始化第二代码类的成员变量和分配内存,从而形成第二代码类的对象。
在另一个实施例中,在建立连接第一代码层、中间层和第二代码层基于第二代码方法的连接关系之后,中间层完成对与第一代码类的对象对应的第二代码类的对象的地址(对象引用)的持有,对于中间层完成对与第一代码类的对象对应的第二代码类的对象的地址(对象引用)的持有来说,提供如下的方式:还包括:
第一代码层调用第一代码类的构造函数中的创建方法;
中间层响应针对创建方法的调用,创建与第一代码类相应的中间对象、以及与第一代码类对应的第二代码类,将中间对象的地址返回第一代码类的对象存储,调用初始化第二代码类的初始化方法;
第二代码层响应针对第二代码类的初始化方法,对第二代码类进行初始化。
在一个实施例中,向第二代码层调用第二代码方法,包括:
中间层在第一代码层调用第二代码方法时,通过第一代码类的对象存储的中间对象的地址,获取到地址指向的第二代码类的对象的地址,根据获取到的第二代码类的对象的地址调用第二代码方法。
步骤107,第一代码层响应中间层针对第一代码方法的调用,执行第一代码方法。
在另一个实施例选中,基于图6,还包括以下步骤:
步骤108,中间层在第一代码方法包括返回操作时,向调用第一代码方法的第一代码层以及第二代码层返回结果。
下面,再结合在Java层中调用C系实现层的C++方法的处理过程进行说明,不难理解地,由于Native层既用于响应来自Java层的针对C系实现层的针对C系方法的调用,也用于响应来自C系实现层的针对Java方法的调用,因此在基于下述记载的Native层响应Java层调用C系实现层的C系方法的处理,可以轻易地实施Native层响应C系实现层调用的Java层的Java方法的处理。
参见图7,图7为本发明实施例提供的Java层调用C系实现层的C++方法的一个可选的流程示意图,在图7中,调用C系实现层的C++方法主要涉及以下几个方面:
Java层需要使用包括有Java本地接口的Java类(具有对C++方法的本地声明的Java类时,会自动调用静态初始化方法,用来初始化Native层中与Java类相应的Native类的静态变量以形成实例化的Native对象,以这种方式将Native对象(Native类的实例)与Java对象(Java类的实例)关联起来;
Java层在创建含有Java本地接口的Java类的对象(也即Java对象,Java类的实例)时,会自动调用native_setup方法,在Native层创建与Java类对应的Native类的对象(Native对象),将Native对象的地址传回Java对象存储,并在Native层创建C++类的对象并持有,在Native层以这种方式将Java层与C系实现层关联起来,达到Java对象、Native对象和C++对象一一对应的效果;
Java层调用Java类中JNI的方法时,Native层会主动通过Java层存储的Native对象地址,获取到相应的C++对象的地址,调用相关C++方法。
下面对图7具体的实现过程进行说明。
首先,Java层在需要调用C系实现层的Native方法(如C++方法)时,创建包括有JNI本地接口的Java类。
在Java源文件中,声明调用的Native方法(如C++方法)所依赖的库的名称,并对所调用的Native方法(如C++方法)以“Native”为关键字进行本地声明,对Java源文件进行编译形成封装有Java本地接口的Java类。
其次,Java层调用Java类的静态初始化方法native_init,初始化Java类在Native层的全局性的数据形成Java对象。
例如,在Native层执行包括以下的初始化操作:初始化Java类的相关联的域的标识(ID);初始化Java类在Native层的全局性的数据,包括与Java类相关的数据、静态数据和Java层数据;初始化Java类相关方法的标识(ID);调用与Java类相关的C++类的初始化方法初始化静态变量。
C系实现对于Native层针对Java类相关的C++类的初始化方法的调用进行响应,C系实现层初始化C++类相关的静态变量形成C++对象,即静态初始化,包括:在Native层初始化与Java类相关的C++类的全局变量、初始化C++静态成员变量、及C++类其他相关的初始化。
Native层执行处理化方法完毕并返回(返回空值,或返回具体结果)Java层之后,对于Java层封装的Java类,通过在Native层和C系实现层进行初始化,将Native对象(Native类的实例)与Java对象(Java类的实例)关联起来。
再次,Java层调用Java类的构造函数中的创建方法native_setup,由Native层创建与Java类相应的Native类所对应的封装对象。
Native层创建相对应的封装对象包括:创建与Java对象对应的Java本地接口类;创建与Java对象对应的Native对象,并且基于初始化的Native对象的相关数据创建出所对应的C++类,并调用初始化C++类的方法初始化C++类。
C系实现层对初始化C++类的方法的调用进行响应,包括:初始化C++类的成员变量,分配内存以及对C++类对象的其他的相关的初始化。
Native层创建完成后返回(返回空值,或返回具体结果)Java层,至此,Java层可以基于Java类中封装的Java本地接口调用C++方法。
最后,Java层调用其他功能性do_native方法,在Native层获取对于需要调用的C++方法对应的C++类的对象地址,Native层根据C++类的对象地址调用C系实现层的C++类的方法,执行C++方法并向Java层返回(返回空值,或返回具体结果)。
本发明实施例实现了以下的技术效果:
1)第二代码层仅是用于响应来自中间层的第二代码方法调用,而不会区分执行用于实现第二代码方法的功能的逻辑是由来自第一代码层的调用导致的,还是由来自第二代码层的内部调用导致的,从而将第二代码方法的调用相关的逻辑与执行用于实现第二代码方法的逻辑进行解耦,使代码的框架结构简明清晰,第二代码方法的代码复用性更高,便于后期的维护管理。
2)通过设置中间层,不仅能够实现第一代码层、以及第二代码层对第二代码层中的第二代码方法进行调用,也能够响应第二代码层对第一代码层的第一代码方法进行调用,实现了在简化调用逻辑的前提下不同代码层互通的效果。
本领域的技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储装置、随机存取存储器(RAM,Random Access Memory)、只读存储器(ROM,Read-Only Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本发明上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机装置(可以是个人计算机、服务器、或者网络装置等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储装置、RAM、ROM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

Claims (22)

1.一种代码处理装置,其特征在于,包括:
第一代码层;第二代码层;中间层,与所述第一代码层耦合,并与所述第二代码层耦合;其中,
所述第一代码层,基于在虚拟机的宿主环境中运行的第一代码实现,包括安装的应用,用于向所述中间层调用由第二代码形成的第二代码方法;
所述中间层,基于所述第二代码实现,用于连接所述第一代码层和所述第二代码层,响应针对所述第二代码方法的调用,向所述第二代码层调用所述第二代码方法;
所述第二代码层,基于能够在特定处理器上直接编译运行的所述第二代码实现,用于向所述中间层调用由所述第二代码形成的所述第二代码方法;以及,响应所述中间层针对所述第二代码方法的调用,执行所述第二代码方法。
2.如权利要求1所述的装置,其特征在于,
所述第二代码层,还用于向所述中间层反向调用由所述第一代码实现的第一代码方法;
所述中间层,还用于响应所述第二代码层针对所述第一代码方法的反向调用,向所述第一代码层反向调用所述第一代码方法;
所述第一代码层,还用于响应所述中间层针对所述第一代码方法的反向调用,执行所述第一代码方法。
3.如权利要求1所述的装置,其特征在于,
所述中间层,还用于在所述第一代码方法包括返回操作时,向调用所述第一代码方法的所述第一代码层以及所述第二代码层返回结果。
4.如权利要求1所述的装置,其特征在于,
所述第一代码层,还用于在向所述中间层调用所述第二代码方法之前,封装本地声明有所述第二代码方法的第一代码类,调用所述第一代码类的初始化方法;
所述中间层,还用于响应所述第一代码层针对所述初始化方法的调用,对所述第一代码类在所述中间层对应的全局性数据进行静态初始化形成所述第一代码类的对象,并调用与所述第一代码类对应的第二代码类的静态初始化方法;
所述第二代码层,还用于响应所述中间层针对所述静态初始化方法的调用,对所述第二代码层中所述第二代码类进行静态初始化,形成所述第二代码类的对象。
5.如权利要求4所述的装置,其特征在于,
所述中间层,还用于初始化所述第一代码类的相关联域的标识;初始化所述第一代码类在所述中间层的全局性的数据,初始化所述第一代码类相关方法的标识。
6.如权利要求4所述的装置,其特征在于,
所述第二代码层,还用于在所述第二代码层初始化所述第二代码类的全局变量、以及初始化所述第二代码类的静态成员变量。
7.如权利要求4所述的装置,其特征在于,
所述第一代码层,还用于调用所述第一代码类的构造函数中的创建方法;
所述中间层,还用于响应针对所述创建方法的调用,创建与所述第一代码类对应的中间对象、以及与所述第一代码类对应的第二代码类,将所述中间对象的地址返回所述第一代码类的对象存储,调用初始化所述第二代码类的初始化方法;
所述第二代码层,还用于响应针对所述第二代码类的初始化方法的调用,对所述第二代码类进行初始化。
8.如权利要求7所述的装置,其特征在于,
所述第二代码层,还用于初始化所述第二代码类的成员变量和分配内存。
9.如权利要求7所述的装置,其特征在于,
所述中间层,还用于在所述第一代码层调用所述第二代码方法时,通过所述第一代码类的对象存储的所述中间对象的地址,获取到所述地址指向的所述第二代码类的对象的地址,根据获取到的所述第二代码类的对象的地址调用所述第二代码方法。
10.如权利要求1所述的装置,其特征在于,
所述第一代码为Java代码,所述第二代码为操作系统的本地代码。
11.一种代码处理方法,其特征在于,包括:
中间层与第一代码层耦合,并与第二代码层耦合;
其中,所述第一代码层基于在虚拟机的宿主环境中运行的第一代码实现,包括安装的应用;所述第二代码层基于能够在特定处理器上直接编译运行的第二代码实现;所述中间层基于所述第二代码实现;
所述第一代码层向中间层调用由所述第二代码形成的第二代码方法;
所述中间层连接所述第一代码层和所述第二代码层,响应针对所述第二代码方法的调用,向所述第二代码层调用所述第二代码方法;
所述第二代码层向所述中间层调用由所述第二代码形成的所述第二代码方法;以及,响应所述中间层针对所述第二代码方法的调用,执行所述第二代码方法。
12.如权利要求11所述的方法,其特征在于,还包括:
所述第二代码层向所述中间层反向调用由所述第一代码实现的第一代码方法;
所述中间层向所述第一代码层反向调用所述第一代码方法;
所述第一代码层响应所述中间层针对所述第一代码方法的反向调用,执行所述第一代码方法。
13.如权利要求11所述的方法,其特征在于,还包括:
所述中间层在所述第一代码方法包括返回操作时,向调用所述第一代码方法的所述第一代码层以及所述第二代码层返回结果。
14.如权利要求11所述的方法,其特征在于,还包括:
所述第一代码层在向所述中间层调用所述第二代码方法之前,封装本地声明有所述第二代码方法的第一代码类,调用所述第一代码类的初始化方法;
所述中间层响应所述第一代码层针对所述初始化方法的调用,对所述第一代码类在所述中间层对应的全局性数据进行静态初始化,形成所述第一代码类的对象,并调用与所述第一代码类对应的第二代码类的静态初始化方法;
所述第二代码层响应所述中间层针对所述静态初始化方法的调用,对所述第二代码层中所述第二代码类进行静态初始化,形成所述第二代码类的对象。
15.如权利要求14所述的方法,其特征在于,所述对所述第一代码类在所述中间层对应的全局性数据进行静态初始化,包括:
所述中间层初始化所述第一代码类的相关联域的标识;初始化所述第一代码类在所述中间层的全局性的数据,初始化所述第一代码类相关方法的标识。
16.如权利要求14所述的方法,其特征在于,所述对所述第二代码层中所述第二代码类进行静态初始化,包括:
所述第二代码层在所述第二代码层初始化与所述第二代码类的全局变量、以及初始化所述第二代码类的静态成员变量。
17.如权利要求14所述的方法,其特征在于,还包括:
所述第一代码层调用所述第一代码类的构造函数中的创建方法;
所述中间层响应针对所述创建方法的调用,创建与所述第一代码类相应的中间对象、以及与所述第一代码类对应的第二代码类,将所述中间对象的地址返回所述第一代码类的对象存储,调用初始化所述第二代码类的初始化方法;
所述第二代码层响应针对所述第二代码类的初始化方法,对所述第二代码类进行初始化。
18.如权利要求17所述的方法,其特征在于,所述对所述第二代码类进行初始化,包括:
所述第二代码层初始化所述第二代码类的成员变量和分配内存。
19.如权利要求17所述的方法,其特征在于,所述向所述第二代码层调用所述第二代码方法,包括:
所述中间层在所述第一代码层调用所述第二代码方法时,通过所述第一代码类的对象存储的所述中间对象的地址,获取到所述地址指向的所述第二代码类的对象的地址,根据获取到的所述第二代码类的对象的地址调用所述第二代码方法。
20.如权利要求11所述的方法,其特征在于,
所述第一代码为Java代码,所述第二代码为操作系统的本地代码。
21.一种代码处理装置,其特征在于,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求11至20任一项所述的代码处理方法。
22.一种计算机可读存储介质,其特征在于,存储有可执行指令,用于引起处理器执行时,实现权利要求11至20任一项所述的代码处理方法。
CN201611051637.9A 2016-11-24 2016-11-24 代码处理装置及代码处理方法 Active CN108376066B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611051637.9A CN108376066B (zh) 2016-11-24 2016-11-24 代码处理装置及代码处理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611051637.9A CN108376066B (zh) 2016-11-24 2016-11-24 代码处理装置及代码处理方法

Publications (2)

Publication Number Publication Date
CN108376066A CN108376066A (zh) 2018-08-07
CN108376066B true CN108376066B (zh) 2020-09-11

Family

ID=63016115

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611051637.9A Active CN108376066B (zh) 2016-11-24 2016-11-24 代码处理装置及代码处理方法

Country Status (1)

Country Link
CN (1) CN108376066B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109815205A (zh) * 2018-12-18 2019-05-28 创新科存储技术(深圳)有限公司 云计算平台访问ufs的方法、存储介质和装置
CN110727504B (zh) 2019-10-21 2022-04-22 百度在线网络技术(北京)有限公司 代码执行方法、装置和渲染设备
CN110764779B (zh) * 2019-10-21 2023-09-15 百度在线网络技术(北京)有限公司 封装方法、注册方法、装置和渲染设备
CN111324647A (zh) * 2020-01-21 2020-06-23 北京东方金信科技有限公司 一种生成etl代码的方法及装置
CN111399844B (zh) * 2020-03-12 2023-11-24 同盾(广州)科技有限公司 安全编译方法、装置、电子设备及计算机可读介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104236579A (zh) * 2014-10-09 2014-12-24 武汉大学 一种基于Android内核层实现高精度卫星导航定位方法
CN104469664A (zh) * 2014-12-26 2015-03-25 乐视致新电子科技(天津)有限公司 一种蓝牙设备信息处理方法和装置
CN104778075A (zh) * 2015-04-03 2015-07-15 北京奇虎科技有限公司 Android系统中native层调用Java层API的方法和装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8756616B2 (en) * 2006-12-29 2014-06-17 Core Wireless Licensing S.A.R.L. System and method for reducing the static footprint of mixed-language JAVA classes

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104236579A (zh) * 2014-10-09 2014-12-24 武汉大学 一种基于Android内核层实现高精度卫星导航定位方法
CN104469664A (zh) * 2014-12-26 2015-03-25 乐视致新电子科技(天津)有限公司 一种蓝牙设备信息处理方法和装置
CN104778075A (zh) * 2015-04-03 2015-07-15 北京奇虎科技有限公司 Android系统中native层调用Java层API的方法和装置

Also Published As

Publication number Publication date
CN108376066A (zh) 2018-08-07

Similar Documents

Publication Publication Date Title
CN108376066B (zh) 代码处理装置及代码处理方法
CN109032691B (zh) 一种小程序运行方法、装置及存储介质
US11861375B2 (en) Configuration for application using microservices
WO2022199111A1 (zh) 应用程序中功能的实现方法、装置、电子设备和存储介质
CN108563517B (zh) 系统接口的调用方法及装置
CN110046023B (zh) 一种基于区块链智能合约的数据处理方法及系统
US11853820B2 (en) Cross-process communication method, apparatus, and device
US20160378554A1 (en) Parallel and Distributed Computing Using Multiple Virtual Machines
US11042387B2 (en) Deploying cross-platform applications on mobile devices with native and web components
US8966508B2 (en) Method for executing hybrid web application and apparatus therefor
US8490117B1 (en) Bridging script engines
CN110007980B (zh) 多业务服务端的实现方法和装置
US20210173665A1 (en) Bootstrapping Profile-Guided Compilation and Verification
EP2802983B1 (en) Isa bridging with callback
CN110825499B (zh) 基于统一容器云平台的安全隔离的实现方法及装置
EP2883133A1 (en) Isa bridging including support for call to overidding virtual functions
CN107678741B (zh) 列表视图的实现方法、装置、可读存储介质及设备
CN106598662B (zh) 基于android的应用加载方法及装置
CN115048642B (zh) 多可信执行环境下可信应用间的通信方法及电子设备
CN115629976A (zh) 一种内核测试方法、装置和存储介质
US10579373B2 (en) Seamless extension porting
CN107092601B (zh) 资源文件构建方法、资源文件应用方法及装置
US20240004616A1 (en) Runtime support for role types that extend underlying types
CN117056317B (zh) 数据处理方法、装置、设备及计算机可读存储介质
CN116009992A (zh) 应用程序内的交互方法及相关装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant