MES系列--(1)JNI使用入门

来源:互联网 发布:淘宝供应商怎么找 编辑:程序博客网 时间:2024/05/18 04:53

在公司从事MES产品开发,先解释一下MES含义吧,MES:Manufacture Execution System,生产执行系统。这层系统是和工业生产中的硬件设备进行交互,控制硬件设备或从硬件设备获取数据。在真实的企业级分层应用中,这一层工作在ERP层之下,向ERP层提供数据,供上层应用节点进行分析处理。、

身为Java Coder,一提到硬件编程,大家立马就想到了JNI(java native interface)java本地化接口。这是java提供的一套和其他语言进行交互调用的标准,尤其是和C,C++。因为实际情况下,硬件厂商提供的硬件驱动程序通常都是C或C++写成的,而我们的系统是基于java的,这两者直接能够产生交互,就只能通过JNI了。

但JNI有自己的标准(即本地代码需要有特殊的接口命名和参数规范),硬件厂商提供的驱动程序(通常为一个dll动态链接库文件)不会符合这种标准,我们的做法是再做一套符合JNI标准的硬件驱动程序,在这套程序中,驱动硬件的部分转调硬件厂商提供的驱动程序,即封装一层。

我们假设这样一个实例,一个32路信号采集卡,硬件厂商提供的驱动程序为一个dll文件,其中有3个接口:打开设备;访问某一路信号;关闭设备。我们要通过java程序去控制并访问这个硬件,标准操作步骤为:

1. 编写用于访问硬件的Java类DeviceHandler,其中有3个native修饰符修饰的方法:native boolean openDevice(); native int accessSignal(int signalIndex); native boolean closeDevice();

2. 通过JDK提供的javah.exe(JDK的bin目录中),将上述类编译后的class文件导出为.h文件,该头文件中包含了对应于上述方法的3个方法定义

3. 安装Visual Studio(或其他顺手的工具)建dll工程,将上述的.h文件进行实现,在实现过程中,通过引用调用硬件厂商提供的dll文件的相关方法即可。最后将这个工程构建为dll文件。

4. 其他的Java类中通过System.loadLibrary(自己生成的dll),即可创建DeviceHandler对象,并且调用其中的native方法。

上述是通过JNI访问硬件设备的基本步骤,没涉及特别具体的部分。但这种操作方式是实际应用过经过检验可行的。以后再谈谈具体的JNI编程。

目前Java又出了一个JNA(java native access)据说比JNI更好用一些。这个实际中没用过,等测试一下后,再写一下分享一点经验。