当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]SUN公司Java虚拟机(JVM)技术的有序开放,使得Java软件真正实现跨平台运行,即Java应用小程序能够在带有JVM的任何硬软件系统上执行。

嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式软件的基本体系结构包括嵌入式实时操作系统RTOS(RealTime operating Systerrl)、嵌入式设备驱动程序、嵌入式应用程序编程接口(中间件)和嵌入式应用程序。

现阶段,计算机应用的普及、互联网技术的实用以及纳米微电子技术的突破,正有力推动着21世纪的工业生产、商业活动、科学实验和家庭生活等领域自动化和信息化进程。全过程自动化产品制造、大范围电子商务活动、高度协同科学实验以及现代化家居生活,为嵌入式产品造就了崭新而巨大的商机。除了沟通信息高速公路的交换机、路由器和调制解调器,构建计算机集成制造系统(CIMS)所需的数据传输系统DCS(Data Communication System)和机器人以及规模较大的家用汽车电子系统,最有产量效益和时代特征的嵌入式产品应数因特网上的信息家电(information appliances),如网络可视电话、网络游戏机、电子商务、商务通(PDA)、移动电话以及多媒体产品(如电视机顶盒、DVD播放机、电子阅读机)。

众所周知,“一次编程,到处使用”的Java软件概念原本就是针对网上嵌入式小设备提出的,几经周折,目前SUN公司已推出了J2ME(Java 2 P1atform Micro Edition)针对信息家电的Java版本,其技术日趋成熟,开始投入使用。SUN公司Java虚拟机(JVM)技术的有序开放,使得Java软件真正实现跨平台运行,即Java应用小程序能够在带有JVM的任何硬软件系统上执行。加上Java语言本身所具有的安全性、可靠性和可移植性等特点,对实现瘦身上网的信息家电等网络设备十分有利,同时对嵌入式设备特别是上网设备软件编程技术产生了很大的影响。


1 Java的性能问题及几种解决方案

Java程序也有其本身的缺陷,那就是其效率问题。由于Java是一种介于解释型和编译型之间的语言,其对内存的管理是通过JVM虚拟机来实现的,同样的程序,如果用编译型语言C来实现,其运行速度一般要比Java快得多。因此,提高Java的性能就显得十分重要。

迄今为止,人们为提高Java的运行速度而做出的许多努力,主要集中在程序设计的方法和模式选择方面。但是由于算法和设计模式的优化是通用的,对Java有效的优化算法和设计模式,对其他编译语言也基本适用,因此不能从根本上改变Java程序与编译型语言在执行效率方面的差异。

另外,JIT(Just In Time,及时编译)技术也是一个比较好的思想。它的基本原理是,首先,通过Java编译器把Java源代码编译成与平台无关的二进制字节码。然后,在Java程序真正执行之前,系统通过JIT编译器把Java的字节码编译为本地化机器码。最后,系统执行本地化机器码,不用对字节码进行解释。这样做的优点是,大大提高了Java程序的性能,缩短了加载程序的时间;同时,由于编译的结果并不在程序运行期间保存,因此也节约了存储空间。缺点是,由于JIT编译器对所有的代码都想优化,因此同样也占用了很多时间。

动态优化技术即提前编译为机器码的技术(dynamicopttmization,ahead of time technology)是提高Java性能的另一个尝试。动态优化技术充分利用了Java源码编译、字节码编译、动态编译和静态编译的技术。其输入是Java的源码或字节码。而输出是经过高度优化的可执行代码和动态库(WindoW中是.dil文件,UNIX中是共享库.a.so文件)。其优点是能大大提高程序的性能,缺点是破坏了Java的可移植性,也对Java的安全带来了一定的隐患。


2 JNI技术

实际上,有一种通常被忽视的技术可以在很大程度上解决这个难题,那就是JNI(Java Native Interface,Java本地化方法)。图1是JNI技术实现的一般步骤。

(1)编写Java类代码

其中,需要JNI实现的方法应当用native关键字声明。在该类中,用System.1oadLibrary()方法加载需要的动态链接库。关键代码如下:
//Compute.java
public class Compute{
public native double comp (double params);
static{
//调用动态链接库
System.loadLibrary(“mathlib”);
}

(2)编译成字节代码

在这个过程中,由于采用了native关键字声明,Java编译器会忽视没有代码体的JNI方法部分。

(3)生成相关JNI方法的头文件

这个过程的实现一般是通过利用jlavah-jni * class生成的,也可以手工生成该文件;但是由于Java虚拟机是根据一定的命名规范完成对JNI方法的调用,所以手工编写头文件需要特别小心。
上述文件产生的头文件部分代码如下:
//Compute.h
;
extern“C”{
JNIEXPORT jdoubleJNICALL Java_Compute_comp(JNI-Env *, jobject, jdoubleArray);
;

JNI函数名称分为三部分:首先是Java关键字,供Java虚拟机识别;然后是调用者类名称(全限定的类名,其中用下划线代替名称分隔符);最后是对应的方法名称,各段名称之间用下划线分割。

JNI函数的参数也由三部分组成:首先是JNIEnv *,是一个指向JNI运行环境的指针;第二个参数随本地方法是静态还是非静态而有所不同一一非静态本地方法的第二个参数是对对象的引用,而静态本地方法的第二个参数是对其Java类的引用;其余的参数对应通常Java方法的参数,参数类型需要根据一定规则进行映射。

(4)编写相应方法的实现代码

在编码过程中,需要注意变量的长度问题,例如Java的整型变量长度为32位,而C语言为16位,所以要仔细核对变量类型映射表,防止在传值过程中出现问题。

(5)将JNI实现代码编译成动态链接库

编译过程是利用C/C++编译器实现的,当要使用生成的动态链接库时,调用者类中需要显式调用该链接库。

经过上述处理,基本上完成了一个包含本地化方法的Java类的开发。


3 基于JNI的嵌入式手机软件开发实例

下面通过一个实例来描述运用JNI技术在手机上操纵摄像头,捕捉视频并存储图片的过程。

(1)活动/状态图

图2为捕捉视频并存储图片的活动/状态图

根据图2的活动/状态,具体的对应步骤如下:

①发起该流程。

②发起流程后,建立文件用于存储图片。

③用指针获得分配的缓冲器,用于存储获得的帧。

④将指针压栈(序列化缓冲器)。由于手机的内存较小,为了防止内存泄漏,Symbian操作系统有一个Cleanup stack的要求,即在使用指针时,用PushL把指针压入栈中,使用完后再用Pop弹出栈.如果在中间调用导致崩溃的函数时果真出现了问题,那么Clean up stack可以通过调用该指针的析构函数回收占用的空间。

⑤操纵摄像头,捕捉视频,并将图像流从摄像头端传到缓冲器。

⑥将摄像头内的图像流存入缓冲器内,并将缓冲器内的流转化为文件流,存为jpg格式的文件,将指向缓冲器的指针弹栈。

⑦在过程⑥中,如果使用完了序列化的缓冲器,则要重新序列化缓冲器,以备后面使用。

⑧当接收到停止视频捕捉的信号后,关闭文件。

⑨流程结束。

(2)运用JNI技术的视频捕捉

子功能捕捉视频的实现是由操纵摄像头、视频播放(解码器准备)以及建立摄像头和手机之间的连接会话三个活动组成的。其中操纵摄像头是通过调用底层设备的驱动来实现的,需要利用JNI来实现,完成的方法包括准备、建立、删除、销毁摄像头等。视频播放的一系列过程也是通过c++代码来实现的,除了准备、建立、删除、销毁解码器外,还有开始、暂停、停止解码等。建立摄像头和手机之间的连接类似建立客户端和服务器连接,视频流从摄像头传到手机界面是通过多媒体会话来完成的。多媒体会话的建立、关闭、摧毁以及会话建立后的发送、取消、读取数据等也是JNI的应用范畴。


结 语

主张采用纯Java的人们通常反对本地化代码的使用,认为JNI技术会影响程序的可移植性和安全性。还有一些人认为,在Java程序执行的过程中调用c/c++程序只是对过去混合编程技术的简单扩展,其实际目的是为了充分利用大量原有的c程序库。

其实,不必拘泥于严格的平台独立性限制,因为采用JNI技术只是针对一些严重影响Java性能的代码段。该部分可能只占源程序的极少部分,所以几乎可以不考虑该部分代码在主流平台之间移植的工作量。同时,也不必过分担心类型匹配问题,完全可以控制代码不出现这种错误。此外,也不必担心安全控制问题,因为Java安全模型已扩展为允许非系统类加载和调用本地方法,即如果在Java程序中直接调用c/c++语言产生的机器码,该部分代码的安全性就由Java虚拟机控制。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式系统开发、调试和测试过程中,J-Link作为一种高效的调试工具,为开发者提供了极大的便利。然而,要想充分发挥J-Link的功能,首先需要正确安装其驱动程序。本文将详细介绍J-Link驱动的安装过程,并深入解析其中...

关键字: jlink 嵌入式系统 嵌入式开发

与谷歌的合作使 Nordic 能够在 nRF Connect SDK 中嵌入开发人员软件,以构建与安卓移动设备兼容的谷歌Find My Device和未知跟踪器警报服务

关键字: 谷歌 SoC 嵌入式开发

嵌入式开发作为当今电子工程和信息技术领域的核心分支,涵盖了广泛的软硬件技术和系统集成方法,用于构建高性能、低成本、低功耗、体积小巧且功能专一的嵌入式系统。这些系统无处不在,从微型传感器节点到复杂的工业控制设备,从日常使用...

关键字: 嵌入式开发 Python

嵌入式开发是当今信息技术领域不可或缺的一部分,它融合了硬件设计、软件开发和系统集成等多个学科,专门用于创建那些被嵌入到特定设备或系统中的专用计算机系统。嵌入式开发的主要过程包括利用分立元件或集成器件进行电路设计、结构设计...

关键字: 嵌入式开发 硬件设计 软件开发

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

嵌入式开发作为信息技术领域的重要分支,其涉及的语言种类繁多,各具特色。这些语言的选择取决于目标平台的特性、性能需求、开发者的熟练程度以及项目的具体要求。本文将详细介绍几种常见的嵌入式开发语言,包括C语言、C++、汇编语言...

关键字: 嵌入式开发 C语言

嵌入式开发是一项综合了硬件设计、软件编程以及系统整合的技术活动,其目的是为了创造出能够在特定环境中高效、稳定运行的嵌入式系统。这一流程涵盖了多个紧密关联且不可或缺的阶段,从最初的客户需求分析到最终的产品测试和交付,每个环...

关键字: 嵌入式开发 硬件设计

嵌入式开发作为一个融合了计算机软硬件和系统工程的综合性领域,其成功与否往往取决于三个核心要素的有效整合与协调。这三个要素分别是:硬件平台的选择与设计、软件开发及其优化、以及系统级的设计与集成。深入理解并熟练掌握这三个方面...

关键字: 嵌入式开发 ARM

嵌入式开发作为信息技术的关键支柱,在全球数字化转型浪潮中扮演着无可替代的角色。从传统的嵌入式微控制器到如今先进的片上系统(SoC),再到与云计算、人工智能深度融合的智能终端,嵌入式系统的演进与发展始终紧跟时代脉搏。本文将...

关键字: 嵌入式开发 智能应用

嵌入式开发是一种专门针对特定硬件平台设计和实现软件系统的工程实践,它涵盖了从需求分析、系统设计、编程实现、调试测试直到产品部署及维护的全过程。本文将深入探讨嵌入式开发的主要阶段,分解其流程并阐述每个步骤的关键要点,以便于...

关键字: 嵌入式开发 嵌入式软件
关闭
关闭