java调用matlab的总结

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程序。效果就出来了。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值