詹秋芳 王岩
摘 要:Eclipse作为一款Java IDE开发环境,受到越来越多程序员的喜爱。但是Eclipse对JNI开发的支持并不友好,很多操作都需要切换到控制台上输入命令来完成,并且不支持对Native函数的调试,这些不利因素无形中增加了JNI开发的成本与难度。文章基于国产平台,系统研究了Eclipse插件开发技术,根据JNI开发的特点,结合用户实际需求,在Eclipse中分别实现了JNI的可视化开发以及调试开发,从Java工程到C工程无缝衔接,界面友好、操作便利,实现了Eclipse环境下对JNI快速开发的支撑,增强了Eclipse IDE的功能,丰富了国产平台的软件生态环境,对于国产平台的产业化发展具有重要的学术意义及应用价值。
关键词:国产平台;Java本地接口;集成开发环境;Java开发工具;C/C++开发工具
Eclipse作为一款Java IDE开发环境,受到越来越多程序员的喜爱。Java是一类解释性语言,具有跨平台执行的特性,但是该特性势必会有部分性能损耗,因此,在开发过程中,如果有实时性的要求,那么通常会采用面向底层、速度更快的语言来实现,JNI技术就是可以实现Java调用另一种语言的函数[1]。但是使用过JNI开发的人都知道,目前,Eclipse IDE对JNI并没有提供可视化开发手段,程序员需要启动终端,手动敲入命令执行部分代码,最后,仍需切回到Eclipse IDE调用验证,而且Eclipse IDE对JNI的调试也没有提供好的解决方案。
针对这一现状,本文将研究“Eclipse JNI快速开发支撑技术”的设计与实现,通过Eclipse插件技术,实现JNI开发的可视化以及JNI Native函数调试的一体化,满足JNI开发的便捷性、实用性的需求,优化Eclipse IDE环境。
1 国产平台
国产平台主要是指国产硬件、国产基础软件以及其他国产应用软件[2]。在基于增强国产平台自主可控能力的共识下,大力推进国产平台产业化发展,积极与产业上下游厂商密切合作,构建完善的国产软硬件生态系统,包括芯片、硬件、軟件、整机系统各个环节,将其应用于通用服务器、大数据、网络安全、安全存储、工业控制等领域[3]。目前,无论是国产硬件还是国产软件,部分关键技术尚未掌握,自主核心技术难以为继,既需要耗费大量精力解决硬件适配问题,又需要持续满足应用开发单位对最新软件开发工具的需要,还需要为用户提供最新、最易用的应用软件。国产平台生态环境仅解决有无问题,离可用、好用都有一定的距离。
2 Eclipse及JNI开发介绍
Eclipse是一个集成开发环境,为用户提供可视化的开发手段,该开发环境初衷主要支持Java等各种应用的开发,可以采用插件的技术来增强Eclipse框架的支撑能力[4]。JNI是Java标准平台中的一个重要功能,弥补了Java与平台无关这一重大不足,在Java实现跨平台的同时,也能与其他语言(如C,C++)的动态库进行交互,给其他语言发挥优势的机会[5]。使用JNI进行开发的优势有以下几点。
2.1 运行效率提高
目前,国产平台的CPU频率明显低于X86架构,当硬件性能暂时无法提升时,对于Java应用来说,实时性要求高的任务可以用C/C++语言来实现,Java和C/C++之间可以采用JNI来实现通信,这样也能比较好地解决Java应用效率低下的问题。
2.2 内存管理利用率高
Java的内存全部由虚拟机来管理,C/C++语言由程序员来管理,可以灵活地操作内存,内存利用率会高很多。
2.3 防破解
由于Native函数采用C/C++语言来实现,会编译成二进制机器代码,所以对于产品的核心技术采用JNI来实现,这样不易破解。
如果使用了JNI,那么Java程序就丧失了跨平台的优点,对于JNI Native函数部分的代码,不同平台架构往往需要重新编译,所以Java应用程序是否使用JNI技术需要考虑业务需求,是效率优先还是部署为重。
通常情况JNI开发的步骤如下:
(1)在Java文件中编写Native调用接口,形如:
(2)定义对应的JNI Native函数的实现。
①通过命令javah,生成Native函数对应的头文件(.h)。
②根据生成的头文件(.h)创建一个对应的源文件(.cpp),文件中包含Native函数实现,用户可以在函数内实现具体业务需求。
③编译源文件(.cpp),生成与架构相关的动态库。
④在Java程序中通过JNI直接调用Native函数以验证功能是否正常。
在上面的步骤中,①和③均需要切换到命令行终端上运行,②需要用户手动创建和编辑源文件。由此可见,目前在Eclipse IDE环境下进行JNI开发异常繁琐。本文提出的JNI快速开发支撑技术,很好地解决了这个问题。
3 JNI快速开发支撑技术的实现方案
JNI快速开发支撑包括“可根据Native函数接口自动创建相应C/C++工程”“在Eclipse IDE环境中支持Java主程序对Native函数的调试”两部分。这两部分功能均可作为一个独立的程序模块,采用Eclipse插件技术来实现,能够动态地添加和自由地删除,比较方便集成到Eclipse IDE环境中。
3.1 JNI可视化开发
JNI可视化开发的功能可概括为:(1)由Native函数生成头文件(.h)及源文件(.cpp)框架。(2)创建可生成动态库的C/C++工程,且工程中需包含相应源文件。(3)C/C++工程编译后得到的动态库能够被Java主程序自动加载。上述功能实现起来表现为一个连续且完整的过程,实现过程如图1所示。
打开Eclipse工程浏览界面,用户单击Java文件时,通过菜单或按钮,激活JNI可视化开发插件提供的Native函数的转换功能,生成Native函数接口的头文件(.h)。用户可选择生成的头文件(.h),插件根据头文件自动创建相应C/C++工程,且工程中包含相应源文件(.cpp)框架,该框架根据Native头文件的函数声明来实现,用户仅需实现业务逻辑即可。C/C++工程编译后产生的动态库文件生成到指定路径下,原Java工程可自动加载该路径下的动态库。
3.2 JNI调试开发
JNI调试开发是指在Eclipse IDE环境下,Java主程序调试运行到Native函数时,能够自动启动GDB进程调试Native C/C++函数主体,并且在IDE环境中提供堆栈、变量、寄存器等调试信息显示窗口供用户诊断。JNI调试开发包括调试环境设置模块、调试通信模块以及调试信息显示模块。调试环境设置模块需要设置C/C++源文件位置、C/C++动态库和调试信息路径以及GDB Attach模式设置等。调试通信模块实现Java调试器与GDB调试进程之间的通信。调试信息显示模块用来显示变量、寄存器、加载模块以及堆栈信息。
如果没有安装JNI调试开发插件,那么在调试Java主程序时,遇到Native函數的调用,通常情况下调试流程是没有办法进入到Native C/C++函数主体内部的。在JNI调试开发插件的支撑下,调试运行到Native函数调用处时,将会启动GDB进程,并且附加到正在调试运行的Java主程序进程空间中[6]。GDB进程在启动的同时,会加载已经配置好的Native C/C++函数的动态库及调试信息,定位Native C/C++函数的源文件。加载完成后,GDB进程暂停在Native C/C++函数入口处,此时,可激活相应的调试堆栈,调试状态将会从Java主程序空间切换到Native C/C++函数空间,此时,Java主程序处于等待状态。接着,可以遵循GDB的调试命令调试Native C/C++函数主题。Native C/C++函数调试结束后,需要断开GDB进程与Java主程序的连接,调试状态会重新返回到Java主程序上,此时,Java主程序对Native C/C++函数的调试过程才结束。带有Native函数的Java主程序调试流程如图2所示。
4 结语
本文重点论述了在国产平台下Eclipse集成开发环境对JNI快速开发支撑技术的实现方案。首先,介绍了当前国产平台下的软件生态环境现状。其次,指出了目前JNI开发的现状,提出了JNI快速开发支撑方案,满足JNI开发的便捷性、实用性的需求,对繁荣国产平台的产业化发展具有重要的学术意义及应用价值。
[参考文献]
[1]任俊伟,林东岱.JNI技术实现跨平台开发的研究[J].计算机应用研究,2005(7):180-184.
[2]程健,吴蔚.国产计算平台在指挥控制系统中的应用研究[J].自动化与信息工程,2011(3):41-44.
[3]倪光南.发展自主可控的信息技术和产业[J].电子产品世界,2015(10):25-26.
[4]张旻,麦先根,贾璐.Eclipse插件开发技术浅探[J].航空计算技术,2006(6):17-18.
[5]董伟巍.JNI技术在网络交互中的应用[J].电子设计工程,2016(6):125-127.
[6]兰利东,乔永强.GDB远程调试环境的设计与实现[J].单片机与嵌入式系统应用,2005(10):22-25.