您的位置:首页 > 编程语言 > MATLAB

java调用matlab的总结

2007-11-05 11:09 519 查看
java中没有直接调用matlab的接口函数,在通常的情况下我们是通过借用C++作为中间过程来实现的,使用C++主要是用c与matlab的结构实现c调用matlab的功能,将这些功能函数封装成dll文件,用java语言调用所生成的dll文件,从而实现了调用matlab的功能。
java调用c程序利用的是java的jni技术,即java native interface。具体的过程为:
1.首先,写一个类:
public class Eng{
static{
System.loadLibrary("Eng"); // (1)
}
public native void plottest(); // (2)
}
这个类实现的是调用后面生成的Eng.dll这个动态连接库的功能。在dos环境下编译
java Eng.java
编译后使用jdk中的javah命令生成jni的头文件
javah -jni Eng
在本目录下就生成了Eng.h这个头文件
2.打开vc++6.0新建一个dll的工程名字叫Eng,这个工程名必须和System.loadLibrary("Eng")中的一样,因为编译生成的dll的名字就是这个工程的名字。
然后在vc++的环境中添加能够调用matlab的功能所需要的lib和一些环境的设置。
(1)Tools->Options->Directories中engine.h所在的路径,笔者所使用的路径为:C:/JDK1.5.0/INCLUDE,在这个对话框中的"Show directories for:"的下拉菜单中选择Library Files,然后添加库文件的路径,在笔者的计算机上的路径是:E:/MATLAB/EXTERN/LIB/WIN32/MICROSOFT/MSVC60。
(2)Project->Settings->Link在Object/Library Modules中加上库文件连接:
也就是自己手动添加三个文件分别是:
libmx.lib libmex.lib libeng.lib
(3)将通过javah生成的Eng.h文件拷贝到工程目录中,然后再FileView中导入到工程中,创建新的c++文件为Eng.cpp,用于实现用于上面的头文件中的函数。指定了engine的头文件所在的路径,所以就可以包括这个头文件了。同时加入其它的头文件就可以了。

具体的cpp文件内容为:

/* Eng.h */
#include "engine.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "windows.h"
#include "Eng.h"

static double Areal[6]={1,2,3,4,5,6};

JNIEXPORT void JNICALL Java_Eng_plottest
(JNIEnv * eng, jobject obj){
Engine * ep;
mxArray * T=NULL,*a=NULL,*d=NULL;
char buffer[30];
double *Dreal,*Dimag;
double time[10]={0,1,2,3,4,5,6,7,8,9};
if (!(ep=engOpen(NULL))) {
MessageBox((HWND)NULL,(LPSTR)"can't start Matlab engine",(LPSTR)"Engwindemo.c",MB_OK);
exit(-1);
}
T=mxCreateDoubleMatrix(1,10,mxREAL);
memcpy((char *)mxGetPr(T),(char *)time,10*sizeof(double));
engPutVariable(ep,"T",T);
engEvalString(ep,"D=.5*(-9.8).*T.^2;");
engEvalString(ep,"plot(T,D);");
engEvalString(ep,"title('Position');");
engEvalString(ep,"xlabel('Time(seconds)');");
engEvalString(ep,"ylabel('Position(meters)');");

a=mxCreateDoubleMatrix(3,2,mxREAL);
memcpy((char *)mxGetPr(a),(char * )Areal,6*sizeof(double));
engPutVariable(ep,"A",a);
engEvalString(ep,"d=eig(A*A');");
engOutputBuffer(ep,buffer,30);;
engEvalString(ep,"whos");
MessageBox((HWND)NULL,(LPSTR)buffer,(LPSTR)"Matlab-whos",MB_OK);
d=engGetVariable(ep,"d");;
engClose(ep);
if (d==NULL) {
MessageBox((HWND)NULL,(LPSTR)"Get Array Failed",(LPSTR)"Engwindemo.c",MB_OK);
}else
{
Dreal=mxGetPr(d);
Dimag=mxGetPi(d);
if (Dimag) {
sprintf(buffer,"Eigenval 2:%g+%gi",Dreal[1],Dimag[1]);
}
else{
sprintf(buffer,"Eigenval 2:%g",Dreal[1]);
}
MessageBox((HWND)NULL,(LPSTR)buffer,(LPSTR)"Engwindemo.c",MB_OK);
mxDestroyArray(d);
}
mxDestroyArray(T);
mxDestroyArray(a);
}
编译这个工程在Debug文件夹中生成一个Eng.dll的文件
3.编写一个测试的java文件:

/* testEng.java */
public class testEng{
public static void main(String [] args)
{
Eng ad=new Eng();
ad.plottest();
}
}
同时将生成的Eng.dll文件和这个testEng.java放在同一个目录中,在dos环境下编译运行这个java程序。效果就出来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: