嵌入式体系是以运用为中心、以计算机技能为根底、软件硬件可裁剪、习惯运用体系对功用、可靠性、本钱、体积、功耗严厉要求的专用计算机体系。嵌入式软件的根本体系结构包含嵌入式实时操作体系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虚拟机操控。