基于VC实现Java和Matlab的通信

转载 2004年07月21日 13:07:00

2003-08-29作者:陈永洲出处: yesky

前言

  系统实现:从JAVA程序传递噪声标准差和两个数据给MATLAB,即给其实现具体的数据计算功能的DLL(通过VC++生成DLL),产生高斯分布的白噪声数据。其中VC需要MATLAB软件自带的"normrnd.m、rndcheck.m"两个文件和产生白噪声的文件"noise.m"。开发环境是:Window2000操作系统、VisualC++6.0和JBUILDER6.0开发工具、MATLAB6.5软件。

  要实现JAVA、MATLAB通信必须解决两方面的问题:一是JAVA与VC++的通信;二是VC++与MATLAB的通信。

  1 实现JAVA与VC通信方法简介

  JAVA与VC的交互,可以通过各自单独运行的程序读写约定的格式的文件来完成,但是通信的实时性不能保证;可以利用CORBA机制,通过定义IDL接口的客户机/服务器(CLIENT/SERVER)的形式通讯;还可以通过JNI(Java Native Interface)或RMI(Remote Method Invocation)等方法实现。
  在微软的操作系统上,实现本机程序的通信应用JNI机制较方便快捷、稳定可靠,并能实现实时通信。本示例系统的实现就使用了此机制。
  1.1 实现JAVA与VC++(DLL)互连

  在JUBILDER6开发环境中,系统先生成NNSD的Project,其框架类名为Frame1。

  系统为了使用VC实现的DLL,在Frame1.java文件中调用VC中函数处添加如下一些代码:

public native void makeNoise(float m,int n);
//实现调用的DLL中函数申明
static
{
System.loadLibrary ("makenoise");
//使用DLL文件,其名称是"makenoise.dll"
}
void jButton1_actionPerformed(ActionEvent e)
//框架通过按钮消息实现DLL的调用
{
int n=160;//白噪声数据量
float m=1.0;//白噪声方差平方
makeNoise(m,n);
//JAVA程序对DLL中函数的使用
}

  1.2 系统运行设置与编译

  使用JBUILDER开发时,须对使用DLL中函数的JAVA文件编译属性进行设置。本系统在JBUILDER工具中的Project视图区域找到Frame1.java(各开发者确定的文件名可能不同)的文件,选中后按下鼠标右键,在出现的菜单中选择"Properties"项,接着将"Build->RMI/JNI->Generate JNI header file"找到的项目选定。最后编译该文件,可得相应的h文件。本系统产生"nnsd_Frame1.h",其中调用的函数为:

JNIEXPORT void JNICALL Java_nnsd_Frame1_makeNoise
(JNIEnv *, jobject, jfloat, jint);

  如果仅使用SUN公司的JDK来实现,须用javah.exe将javac.exe生成的class文件去生成对应的h文件,之后并要修改h文件,即须将文件的包层次在调用的函数名上体现出来。

  1.3 JAVA应用系统运行

  将VC生成的DLL文件拷到JBUILDER运行程序的目录下,执行程序,就实现了JAVA系统和MATLAB的通信。本示例系统的DLL是"makenoise.dll",即下面介绍的方法所产生的。

2 实现VC、MATLAB通信方法简介

  MATLAB提供了许多方法与VC程序的通信:MATLAB引擎(ENGINE)采用了客户机/服务器(CLIENT/SERVER)的计算模式,通过MATLAB应用程序接口(API)中有关函数,在VC环境中调用MATLAB函数,但此种方法需要MATLAB后台支持,因此系统必须安装MATLAB;MATLAB本身提供的MCC工具编译,编译m文件生成VC++或c语言,直接在VC中使用;MATLAB的MEX工具将m文件编译成dll,供VC调用,但这增加的程序的复杂性,没有第二种方法灵活。

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

  2.1 MATLAB与VC实现互连

  为了使用MATLAB的具体功能,在开发环境中应首先安装MATLAB工具软件,之后运行此工具软件,分别执行"mex -setup;mbuild -setup;cd(prefdir); mccsavepath;"命令。现在再运行VC开发工具,从菜单开始依次打开"Tools->Customize->Add-ins and Macro Files",选中MATLAB Add-in项,就可以看到工具栏中多了一个62479.gif  。现在VC就可以利用它来得到m文件所对应的c、c++文件。

  2.2 开发工具VC运行环境设置

  系统开发时,须对VC的开发环境变量进行设置。通过"Tools->Options->Directories"找到的Directories项中添加环境变量。

  添加头文件和库文件搜索路径[3]是(本计算机的文件搜索路径为):

F:/MATLAB6P5/EXTERN/INCLUDE F:/MATLAB6P5/EXTERN/INCLUDE/CPP F:/MATLAB6P5/EXTERN/LIB F:/MATLAB6P5/EXTERN/LIB/WIN32 F:/MATLAB6P5/EXTERN/LIB/WIN32/MICROSOFT/MSVC60

  上述为VC编译MATLAB的m文件生成C++代码的环境。同时为了编译JNI的h文件,还须通过菜单Tools.和Project添加如下头文件和库文件搜索路径:

D:/JBUILDER6/JDK1.3.1/INCLUDE D:/JBUILDER6/JDK1.3.1/INCLUDE/WIN32

  2.4 VC生成DLL[4]

  在本系统中,VC建立名称为makenoise的"MFC APPWizard(dll)"Project,按照VC默认的选项完成工程的创立。

  将1.2中生成的nnsd_Frame1.h文件拷贝到系统目录下,并添加到VC的"FileView"中"HeadFiles"里面。通过MATLAB Add-in将"normrnd.m、rndcheck.m、noise.m"文件添加到VC中,并自动生成VC文件。具体操作步骤如下:

  点击工具栏中"Add m-files to current project"项,在出现的图中选定如下选项:

62480.gif
图1 添加m文件的Add-in选择

  按照接着步骤的提示将上述3个m文件添加到项目中。

  在VC中为了对外提供可调用的函数,须在"makenoise.cpp"文件中添加:

#include "nnsd_Frame1.h"
JNIEXPORT void JNICALL Java_nnsd_Frame1_makeNoise
(JNIEnv *env, jobject obj, jfloat m, jint n){}
//将原申明的函数的变量名补上,具体实现功能代码在下面。

  为了让上述导出函数获得对MATLAB中白噪声函数的调用,须在此文件中再添加:

#include "math.h"
#include "dblmtrx.h"
//下面申明得到全局matlab的函数
extern void InitializeModule_noise();//初始化
extern void noise(mwArray n, mwArray m);//产生白噪声函数
extern void TerminateModule_noise();//关闭资源
//dll导出JAVA函数的具体实现部分
JNIEXPORT void JNICALL Java_nnsd_Frame1_makeNoise
(JNIEnv *env, jobject obj, jfloat m, jint n)
{
AfxMessageBox("开始产生白噪声!");
InitializeModule_noise();
noise(n,m);
TerminateModule_noise();
}

  编译整个程序,于是便得到"makenoise.dll"。

  2.3 脱离MATLAB环境运行的支持文件

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

  3 结论

  采用JAVA完成图形界面设计、数据管理等,利用MATLAB数学库完成软件核心算法设计,很大程度上降低了编程难度和工作量, 缩短开发周期,提高软件可靠性。尤其利用编译器调用MATLAB动态连接库实现脱离MATLAB环境下二者的紧密结合,更极大拓展了MATLAB的应用范围。基于VC++6.0实现JAVA和MATLAB的通信,深化了JAVA和MATLAB的应用能力。

  附注:noise.m文件的内容如下:

function makeNoise(n,m)
c=normrnd(0,m,1,n);
s='样本文件.txt';
fid=fopen(s,'W');
fprintf(fid,'%6.2f',c);
fclose(fid);

 

基于VC实现Java和Matlab的通信

2003-08-29 16:34 来源:yesky 作者:陈永洲 责任编辑:方舟·yesky 评论(0)       前言   系统实现:从JAVA程序传递噪声标准差和两个数据...
  • yuanyuan_186
  • yuanyuan_186
  • 2013年02月27日 21:17
  • 328

VC 串口通信实现方式

利用师姐QT2440开发板控制机械臂, 串口通信出现问题, 找到usb转串口后,任然找不到相应的驱动。初步打算用单片机实现。 1.基于Active控件的方式(MSComm)  ...
  • u014114990
  • u014114990
  • 2016年04月21日 15:32
  • 1565

VC 线程通信的3种方法

1.使用全局变量    实现线程间通信的方法有很多,常用的主要是通过全局变量、自定义消息和事件对象等来实现的。其中又以对全局变量的使用最为简洁。该方法将全局变量作为线程监视的对象,并通过在主线程对此...
  • slj_win
  • slj_win
  • 2014年03月18日 09:37
  • 795

VC实现串口通信例程

VC实现串口通信例程 作者:阮帮秋(2001.4) 摘要:WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所...
  • songshu1007
  • songshu1007
  • 2014年05月19日 16:29
  • 600

VC和MATLAB混合开发经验总结

作者:朱金灿来源:http://blog.csdn.net/clever101 前期准备:       1.请确认机器中已经安装Matlab主程序或(MCR)MATLAB Compiler Runti...
  • clever101
  • clever101
  • 2014年08月31日 23:39
  • 4033

Matlab与VC混合编程之二

Matlab与VC混合编程之二 1. 待解决的新问题 在《Matlab与VC混合编程之一》中我们已经实现了在VC中调用Matlab编译M文件生成的COM的方法,并成功的进行了计算并绘制一个点。接下来...
  • zhangkunhn
  • zhangkunhn
  • 2013年07月01日 23:59
  • 821

VC++ API实现串口通信

【原文】http://dev.yesky.com/401/2308901.shtml
  • u012234115
  • u012234115
  • 2014年07月17日 20:51
  • 3617

利用UDP matlab与VS实时通信传输数据

利用UDP,在matlab与C#间实时通信的介绍。
  • ajing2014
  • ajing2014
  • 2015年11月14日 10:32
  • 5395

VC_MFC串口通信编程详解

在工业控制中,工控机(一般都基于 Windows 平台)经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛.   一般情况下,工控机和各智能仪表通过 RS485 总线进行通信.RS4...
  • beikefengling123
  • beikefengling123
  • 2014年04月18日 11:40
  • 1956

VC 进程间通信

VC 进程间通信   进程间通信既可以用非标准的进程间通信技术,如Windows消息、内存映射和内存共享等,也可以用标准的通信技术。 一、微软标准进程间通信技术...
  • aristolto
  • aristolto
  • 2013年09月06日 16:33
  • 5091
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于VC实现Java和Matlab的通信
举报原因:
原因补充:

(最多只允许输入30个字)