INTERNET/INTRANET网络通信技术的迅猛发展的今天,分布式异构集成应用系统的开发和 使用是必然发展方向;JAVA具有稳定、可靠、跨平台等优点,利用其开发分布式计算系统 ,是必然的趋势。同时,JAVA开发必须继承并集成现存的系统,因此,JAVA与各现存的软 件系统通信现在已经提上了日程。

MATLAB
Mathworks公司推出的针对数值计算的交互式软件,具有强大的数值分析、矩阵运
算、信号处理和图形显示功能;MATLAB以其强大的数据处理能力和丰富的工具箱使得他的编 程极为简单,可大幅缩短应用程序开发周期,提高编程效率。因而JAVA通过VC++实现MATLAB 的图形处理和显示是提高效率的一种可行策略。最终实现JAVAMATLAB通信必须解决两方 面的问题:一是JAVAVC++的通信;二是VC++MATLAB的通信。 本系统(是分布式网络多代理系统中的一代理服务器——人工神经网络代理服务器)的功 能实现是:从JBUILDER开发环境的JAVA程序通过调用包含MATLAB图形处理和显示功能DLL 实现图像显示。其中VC需要MATLAB“title.mxlabel.mylabel.m”三个文件和为实现 图形处理显示编写的文件“errorpicture.m”。系统的开发环境是:WindowXP操作系统、
VisualC++6.0
JBUILDER6.0开发工具、MATLAB6.5软件。


1
实现JAVAVC通信方法简介

JAVA
VC的交互可以通过各自单独运行的程序读写约定的格式的文件来交流,但是通信的
实时性不能保证;可以利用CORBA机制,通过定义IDL接口的客户机/服务器(CLIENT/SERVE
R)
的形式通讯,这加大了系统简单功能实现的复杂化;还可以通过JNI
Java Native Int
erface
)或RMIRemote Method Invocation)等方法实现。
在微软的操作系统上,实现本机程序之间的通信应用JNI机制较方便快捷、稳定可靠,并能 实现实时通信。本示例系统的实现就使用了此机制。

1.1
实现JAVAVC++DLL)互连
首先在JBUILDER中建立一工程,如:MASS,使用MASSFrame为框架(Frame)的类名。 系统为了使用VC中实现的MATLAB图形处理的DLL,需在JAVA文件的class MASSFrame中, 添加如下一些代码:
public native void showPicture();
//
实现调用的DLL中函数申明

static
{
System.loadLibrary ("showpicture");
//
使用DLL文件,其名称是
“showpicture.dll”
}
void jBShowPicture_actionPerformed(ActionEvent e)
{
showPicture();
//JAVA
程序对DLL中函数的使用

}
1.2
系统运行设置与编译
须对使用DLLMATLAB函数的JAVA文件编译属性进行设置,在JBUILDER工具中的Project 视图区域找到class MASSFrame.java(各开发者确定的文件名可能不同)的文件,选中 后按下鼠标右键,在出现的菜单中选择“Properties”项,接着按照“Build->RMI/JNI->
Generate JNI header file”
找到“Generate JNI header file”项目,选定。编
译该文件,可得相应的h文件。本系统产生“mass_ MASSFrame.h”,其中调用的函数为:
“JNIEXPORT void JNICALL Java_mass_MASSFrame_showPicture (JNIEnv *, jobject);
如果仅使用SUN公司的JDK来实现,须用javah.exejavac.exe编译生成的class文件去生成 对应的h文件,接着修改h文件,即将文件所在的包层次,在被调用的函数名上体现出来, 也就是“JNIEXPORT void JNICALL Java_MASSFrame_showPicture (JNIEnv *, jobject);
修改为上面的调用函数名。


1.3 JAVA
应用系统运行
VC生成的DLL文件拷到JBUILDER当前运行程序的目录下,执行程序,就实现JAVA系统和M
ATLAB
的通信。本示例系统的DLL“showpicture.dll” (即下面的实现VCMATLAB
信方法简介所产生的)。其运行结果显示图如图1
http://www.ccw.com.cn/resources/AD03A50E-9B02-4DB6-81C2-F5E6AD6FBCCC/0819a.jpg
1 JAVA调用DLL的图像显示



2
实现VCMATLAB通信方法简介


MATLAB
提供了许多方法与VC程序的通信:MATLAB引擎(ENGINE)模式,采用了客户机/服务器

(CLIENT/SERVER)
的计算形式,通过MATLAB应用程序接口(API)中有关函数,VC环境中调用

MATLAB
函数,但此种方法需要MATLAB环境后台支持,因此系统必须安装MATLABMATLAB本身
提供的MCC工具编译,编译m文件生成VC++c语言,直接在VC中使用;MATLABMEX工具将
m
文件编译成DLL,供VC调用。。。。。。


MATLAB
现具有的MATLAB Add—in(其包装了MCCMEX)更方便了第二、三种方法的应用,
现本系统的实现就是以第三种为基础的。

2.1 MATLAB
VC实现互连
为了在开发时实现对MATLAB的具体功能的调用,应首先在操作系统中安装MATLAB工具软件 ,之后并运行此工具软件,依次执行“mex –setupmbuild –setupcd(prefdir); mc
csavepath;”
命令。之后运行VC开发工具,从VC++菜单中依次打开
“Tools->Customize->
Add-ins and Macro Files”
,选中MATLAB Add—in宏,可以看到工具栏中多了一个

http://www.ccw.com.cn/resources/AD03A50E-9B02-4DB6-81C2-F5E6AD6FBCCC/0819b.jpg
现在VC就可以利用它来得到m文件所对应的cc++文件。


2.2
开发工具VC运行环境设置
开发时,须对VC的开发环境变量进行设置。通过“Tools->Options->Directories”找到的
“Directories”
项中添加环境变量。
添加头文件和库文件搜索路径有(本计算机的文件搜索路径为):
F:MATLAB6P5EXTERNINCLUDE
F:MATLAB6P5EXTERNINCLUDECPP
同时将MATLAB的链接库添加到VC中。从“Tools->Options->Directories”
“Show dire
ctories for
下拉框里选择“Library files”,然后再在“Directories”项中添加环
境变量。

F:MATLAB6P5EXTERNLIB
F:MATLAB6P5EXTERNLIBWIN32 F:MATLAB6P5EXTERNLIBWIN32MICROSOFTMSVC60
上述为VC编译MATLABm文件生成C代码的环境。同时为了编译JNIh文件,还须通过菜单

Tools.
Project添加如下头文件和库文件搜索路径:
D:JBUILDER6JDK1.3.1INCLUDE
D:JBUILDER6JDK1.3.1INCLUDEWIN32

2.4 VC
生成
DLL 本系统首先用VC建立“MATLAB Project Wizard”项中名称为showpictureProject,其中
Project
的选项结果如下图2所示:

http://www.ccw.com.cn/resources/AD03A50E-9B02-4DB6-81C2-F5E6AD6FBCCC/0819c.jpg
2 创建工程选项结果
1.2中生成的mass_ MASSFrame.h文件拷贝到系统目录下,并添加到VC“FileView”
“HeadFiles”
里面。
VC中为了对JAVA程序提供可调用的函数,须在“showpicture.c”文件中添加:
#include " mass_ MASSFrame.h"
//dll
导出的JAVA调用函数的具体实现部分

JNIEXPORT void JNICALL
Java_mass_MASSFrame_showPicture
(JNIEnv *en, jobject ob)
{
showpictureInitialize();//
初始化

mlfErrorpicture();//
图像显示

mlfHGWaitForFiguresToDie();//
关闭显示相关资源

}
“F7”
编译程序,于是便得到“showpicture.dll”


2.3
脱离MATLAB环境运行的支持文件
为了在没有安装MATLAB应用软件的环境下,能够使用其功能的DLL,须在运行此DLL的目录 中添加一些文件,而这些文件可以通过工具栏中的“MATLAB Add-in Packager”获得。按 照此工具默认的配置运行,得到一个zip压缩文件,使用时,将其解压到DLL文件所在的目 录中,DLL就能脱离MATLAB环境使用。

3
结论
采用JAVA系统在对外服务时,利用MATLAB完成软件核心算法设计和图形处理、显示,很大程 度上降低了编程难度和工作量, 缩短开发周期,并提高了软件的可靠性。基于VC++6.0实现
JAVA
MATLAB的通信——利用VC编译器调用包含MATLAB处理功能的动态连接库实现脱离
MA
TLAB
环境下运行实现JAVAMATLAB二者的紧密结合,更极大拓展了MATLAB的应用范围,并
同时也深化了JAVAMATLAB的应用能力。 附注:errorpicture.m文件的内容如下:
function errorpicture()
s='NN
训练误差结果显示
.txt';
fid=fopen(s,'r');
while (feof(fid))~=true
[x,n]=fscanf(fid,'%12f');
end;
if(n>1)
t=1:1*100:n*100;
plot(t,x);
ylabel('
误差绝对值
');
xlabel('
训练次数(次)
');
title('
人工神经网络训练误差结果显示图
');
grid;
end;
fclose(fid);


: JAVAVC++MATLAB的混合编程应用