J9开发--AWT类库的安装和配置- -| 回首页 | 2006年索引 | - -在QNX平台上开发Java应用程序 1

J9C 编译器的使用

                                      

2.1 J9C 编译器的使用

j9c是J9虚拟机自带的字节码编译器,相当于标准版Java开发工具中的javac命令。这个编译器的用法如下:

#j9c <编译选项> <源代码文件 | 目录名>

在j9c编译器中主要的编译选项如下:

-help
打印于编译有关的帮助信息
-version
显示编译器的版本号
-classpath
指定编译时刻使用的类路径
-d
指定存放字节码文件的目录名,如果没有指定目标目录名,编译器将不生成包目录结构
-nowarn
隐藏编译器的警告信息
-warn
设定编译器的警告水平
-g
设定是否生成调试代码

2.2 J9虚拟机的使用

和标准版Java开发工具相类似,可以使用j9命令启动J9虚拟机。这个命令的用法如下:

#j9 <运行选项> 主类名称 [运行参数]
#j9 <运行选项> -jxe:jxe文件 [运行参数]

J9虚拟机中主要的运行选项如下:

-jxe
运行所指定的jxe文件
-jxespace
为jxe文件指定所使用的内存(十六进制)
-jxeaddr
从内存中直接运行一个jxe格式的应用程序
-cp
将path指定为运行时刻所使用的类路径
-D
在运行之前设定系统的环境变量
-debug
在指定的端口启动JDWP调试服务器
-jcl
指定所使用的JCL动态连接库
-verbose
详细输出相关的调试信息其中class和gc是缺省的选项

2.3 J9虚拟机上的标准类库

嵌 入式应用程序和普通应用程序的最大的区别在于嵌入式应用程序处处要受到目标平台的处理速度,内存大小以及存储空间的限制,而基于PC 的应用程序所受的限制则相对要小很多。基于以上考虑,所选择的虚拟机必须在能够满足系统要求的情况下尽可能的少占用系统存储空间,经过编译的字节码文件必 须尽可能的以提高执行效率。因此,在嵌入是应用程序的开发中,虚拟机的裁剪是提高系统整体性能的至关重要的一个环节。

基 于如上需求,J9虚拟机专门为不同的应用提供了不同的标准类库。这些标准类库均提供了运行Java应用程序所必须的基本类,例如Java语言中最基本的 java.lang.Object和java.lang.String等等。一个完全版的 J9虚拟机通常包括如下标准类库:

jclXtr
这 是一个极小型的类库,大约90 KB, 当你的存储空间和内存极度紧张并且你能够容忍功能局限的情况下可以考虑这一个类库(QNX 的缺省安装里面没有)。这个类库提供了如下Java 2标准类库的一个子集:java.io, java.lang, java.net, java.util。

jclCldc
这 是J9虚拟机向资源极度紧张的目标平台所推荐的最小配置,大约166 KB。在jclXtr类库中仅提供了最基本的 IO功能,在jclCldc 类库中则大幅度的增加了对IO以及网络应用的支持,例如http, ftp, comm, datagram, file, serversocket, socket等。这个基本类库所在的位置是$J9_HOME/lib/jclCldc

jclCore
这 是一个为微小型设备设计的一个轻量级的基本类库,它提供了基本的文件IO以及对网络应用的支持,大约占用空间346 KB,是J9虚拟机为资源不太紧张的目标平台所推荐使用的核心类库(所以叫做jclCore )。这个类库包括了Java 2中如下包里面的大部:java.io, java.lang, java.net, java.util, java.util.zip。在QNX 的缺省安装中不包括jclCore基本类库。

jclGateway
这 个基本类库是在jclCore基本类库的基础上构建的,大约600 KB,主要的改进是提供了安全检查的功能。这个类库除了jclCore 基本类库所包含的内容之外还提供了如下包和类:完整的java.lang.reflect包; java.net.URL包,但是不包括URLClassLoader包; java.lang.SecurityManager包,但是不包括java.security.acl包;提供 java.lang.Runtime.exec()方法。在QNX 的缺省安装中不包括jclGate基本类库。

jclMax
这 是一个专门为资源比较宽裕的目标平台所设计的基本类库,大约2732 KB。这个基本类库里面包括了Java 2 里面的大多数包和类,包括java.lang, java.lang.ref, java.lang.reflect, java.io, java.net, java.math, java.txt, java.util, java.util.jar, java.util.zip。此外,jclMax基本类库还基于如下包提供了Java 2风格的安全检查功能,包括: java.security, java.security.interfaces, java.security.acl, java.security.spec, java.security.cert, com.ibm.oti.security.provider。这个基本类库所在的位置是$J9_HOME/lib/jclMax

jclPersonal
这 个类库提供了AWT, RMI以及对Java Bean的支持。QNX 的缺省安装中不安装这个类库,但是可以从IBM 的主页上面下载。另外,如果你已经在QNX上面安装了Eclipse的话,你也可以使用SWT来构建你的图形界面。这些内容将会在本系列文章的后面讲述。

不包括在QNX 缺省安装中的J9标准类库可以从IBM 公司开发的Webshpere Studio Device Developer 中获得。Webshpere Studio Device Developer是基于Eclipse项目的针对嵌入式 Java应用的一个集成开发环境,可以从IBM 公司的主页免费下载,下载地址是 http://www.ibm.com/software/ad/embedded。

2.4 一个从串口设备采集数据的简单程序

数 据采集与处理是当前嵌入式应用的一个热点。在这种应用中,嵌入式系统与各种各样各样的传感器或者是数据采集器等外接设备进行通讯,在其内部对各种数据进行 处理并向外接设备输出反馈信号。到目前为止,串口通讯(主要是RS-232和RS-485)仍然是传感器与主机进行通讯的主流方式,因此在一个嵌入式应用 程序中,经常需要通过串口与串口设备进行通讯。

在标准版 的Java语言中,串口通讯是通过扩展类库javax.comm来实现的。由于这个扩展类库在标准的JDK 中并不提供,需要使用到串口通讯功能的软件开发人员必须到IBM或者是Sun公司的网站去下载,在一定程度上影响了这个扩展类库的普及和使用。J9虚拟机 在设计上充分考虑到了嵌入式应用的需求,在各个版本的标准类库中都提供了对串口通讯的支持。这些功能被放在serial.jar这个包里面,可以在如下目 录下找到:

$J9_HOME/lib/jclCdc/serial.jar
$J9_HOME/lib/jclFoundation/serial.jar

在QNX 系统上,J9虚拟机缺省的类路径(CLASSPATH)是jclMax标准类库,也就是$ J9_HOME/lib/jclMax/classes.zip。也就是说,如果在程序中需要用到串口通讯的时候,我们需要将serial.jar添加到 虚拟机的类路径里面去。在QNX系统上设置类路径的方法于Linux系统比较相似,只需要修改 .profile文件把新的CLASSPATH定义好就可以了。

# export CLASSPATH=$J9_HOME/lib/jclCdc/serial.jar

J9虚拟机缺省的类路径,也就是$J9_HOME/lib/jclMax/classes.zip 不需要显式的定义。

serial.jar里面包含了很多用于与串口设备进行通讯的类,需要详细了解的网友可以自行参考相关的文档。一般来说,于串口设备进行通讯需要经过如下步骤:

(1) 创建一个SerialConfiguration对象,然后根据特定设备的通讯参数修改一下波特率等值。
(2) 创建一个SerialPort对象,在创建这个对象的时候需要使用到串口的名称以及刚才创建好的SerialConfiguration。
(3) 利用SerialPort类的getInputStream() 和getOutputStream()方法获得串口设备的输入输出流,通过该设备的输入输出流即可与该设备进行通讯。
(4) 当不再使用这个串口设备的时候,利用SerialPort.close()关闭与该设备的连接,同时释放所占用的系统资源。

在QNX 系统下,设备名被保存在/dev目录下,串口设备被起名为ser(n),其中n是该串口设备的编号,从1 开始计数。例如/dev/ser1相当于晕倒死系统上的COM1,/dev/ser2相当于晕倒死系统上的COM2。因此,虽然J9 虚拟机在各个平台上都提供了对串口进行操作的包serial.jar,但是程序员仍然需要考虑到在不同的平台上设备名是不一样的。

下面的示范程序演示了与串口进行通讯的一般过程。该程序与连接在ser1 的设备进行通讯,将该设备的输出信息打印到屏幕上。


import java.io.*;
import com.ibm.ive.serial.*;

public class SerialDemo
{
public static void main(String[] args)
{
// 构造SerialPortConfiguration对象并且配置通讯参数
SerialPortConfiguration SPC = new SerialPortConfiguration();
SPC.baudRate = 19200;
SPC.dataBits = 8;
SPC.stopBits = 1;
SPC.parity = 0;

try
{
// 构造SerialPort对象,构造成功以后系统已经与指定的设
// 备连接上了
SerialPort SP = new SerialPort("/dev/ser1", SPC);
// 获得设备的输出并读取数据
InputStream DevIn = SP.getInputStream();
for (int i = 0; i < 10000; i++)
System.out.println(DevIn.read());
// 关闭与串口设备的连接
SP.close();
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}

对上面这个示范程序进行编译的时候,由于程序中使用了jclMax标准类库之外的类,所以需要在编译的时候指定类路径,也就是:

# j9c -classpath $CLASSPATH SerialDemo.java

在运行这个示范程序的时候,不需要再次显式的指定类路径,因为j9命令会自己到系统的CLASSPATH里面去找:

# j9 SerialDemo

需要说明的是,在J9虚拟机中同样提供了对扩展类库javax.comm的支持。但是基于 J9虚拟机的嵌入式Java应用中,普遍的做法是直接使用J9虚拟机本身的serial.jar。

【作者: bom】【访问统计:】【2006年12月28日 星期四 11:04】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=5995557

回复

验证码:   
评论内容: