java中没有直接调用matlab的接口函数.docx
- 文档编号:23549400
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:13
- 大小:49.31KB
java中没有直接调用matlab的接口函数.docx
《java中没有直接调用matlab的接口函数.docx》由会员分享,可在线阅读,更多相关《java中没有直接调用matlab的接口函数.docx(13页珍藏版)》请在冰豆网上搜索。
java中没有直接调用matlab的接口函数
java中没有直接调用matlab的接口函数,在通常的情况下我们是通过借用C++作为中间过程来实现的,使用C++主要是用c与matlab的结构实现c调用matlab的功能,将这些功能函数封装成dll文件,用java语言调用所生成的dll文件,从而实现了调用matlab的功能。
java调用c程序利用的是java的jni技术,即javanativeinterface。
具体的过程为:
1.首先,写一个类:
publicclassEng{
static{
System.loadLibrary("Eng"); //
(1)
}
publicnativevoidplottest();//
(2)
}
这个类实现的是调用后面生成的Eng.dll这个动态连接库的功能。
在dos环境下编译
javaEng.java
编译后使用jdk中的javah命令生成jni的头文件
javah-jniEng
在本目录下就生成了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,在这个对话框中的"Showdirectoriesfor:
"的下拉菜单中选择LibraryFiles,然后添加库文件的路径,在笔者的计算机上的路径是:
E:
\MATLAB\EXTERN\LIB\WIN32\MICROSOFT\MSVC60。
(2)Project->Settings->Link在Object/LibraryModules中加上库文件连接:
也就是自己手动添加三个文件分别是:
libmx.liblibmex.liblibeng.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"
staticdoubleAreal[6]={1,2,3,4,5,6};
JNIEXPORTvoidJNICALLJava_Eng_plottest
(JNIEnv*eng,jobjectobj){
Engine*ep;
mxArray*T=NULL,*a=NULL,*d=NULL;
charbuffer[30];
double*Dreal,*Dimag;
doubletime[10]={0,1,2,3,4,5,6,7,8,9};
if(!
(ep=engOpen(NULL))){
MessageBox((HWND)NULL,(LPSTR)"can'tstartMatlabengine",(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)"GetArrayFailed",(LPSTR)"Engwindemo.c",MB_OK);
}else
{
Dreal=mxGetPr(d);
Dimag=mxGetPi(d);
if(Dimag){
sprintf(buffer,"Eigenval2:
%g+%gi",Dreal[1],Dimag[1]);
}
else{
sprintf(buffer,"Eigenval2:
%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*/
publicclasstestEng{
publicstaticvoidmain(String[]args)
{
Engad=newEng();
ad.plottest();
}
}
同时将生成的Eng.dll文件和这个testEng.java放在同一个目录中,在dos环境下编译运行这个java程序。
效果就出来了。
根据预测系统的需要,现在希望能在Java中直接调用Matlab的函数。
但,搜索几时,找到的都是在Matlab中调用java的方法,只看到如下一篇文章中提到:
在Matlab的新版中提供了此功能的初体验!
但最新版的Matlab是必不太好找,只好想法用java的jni接口,调用C,使用C去调用Matlab了。
这样效率就牺牲了,真是没辙!
【原创】JavaBuilder初体验
本文节选自:
2006-10-1911:
43作者:
junziyang
MATLAB的最新版本2006b中新添了一个产品-MATLABBuilderforJava。
其实本来Matlab就有Java外部程序接口,不过原来的接口只能在.m文件中调用Java,而无法在Java程序中调用Matlab。
新的JavaBuilder为我们在Java程序中调用Matlab丰富的数值计算资源提供了极大的便利。
与MATLAB对其他程序的外部接口相比,我觉得Java接口在一下几个方面比较有特色:
(1)在.m文件中可以直接调用Java资源。
例如可以调用JDK中的界面元素构建用户界面。
(2)可以利用Java在网络功能方面的优势,开发基于Web的应用程序。
由于JavaBuilder是个新产品,我也是相应bainhome版主的号召,现炒现卖:
),旨在抛砖引玉,引发有兴趣的网友的共同讨论。
错误之处敬请批评指正。
什么是MATLABBuilderforJava?
MATLABBuilderforJava(又叫JavaBuilder)是对MATLABCompiler的扩展。
用JavaBuilder可以将MATLAB函数包装到一个或多个Java类中形成一个Java组件或包。
每个MATLAB函数被封装为Java类的一个方法,可以在Java应用程序中被调用。
环境变量设置
为了使用JavaBuilder来进行开发,你的计算机上必须安装有JDK,而且必须对自己计算机的环境变量进行必要的设置,具体步骤如下:
(1)点击开始->右击“我的电脑”,选择“属性”。
在弹出的“系统属性”对话框中选择“高级”标签,然后点击下发的“环境变量”按钮。
(2)设置JAVA_HOME变量
a.点击弹出的对话框中上方的“新建”按钮;
b.变量名:
JAVA_HOME;
c.变量值:
JDK的安装目录,需要设置为javac.exe的上一层目录。
例如我的机器上javac.exe在C:
\Sun\AppServer\jdk\bin中,那么JAVA_HOME的变量值应设为C:
\Sun\AppServer\jdk。
d.点击“确定”。
(3)设置CLASSPATH变量
a.点击“新建”
b.变量名:
CLASSPATH
c.变量值:
.;matlabroot\toolbox\javabuilder\jar\javabuilder.jar;
d.点击“确定”。
(4)“确定”,“确定”,退出属性设置。
说明:
进行完上述设置后就可以用JavaBuilder简单的开发了。
但需要说明的是,如果你的Java程序中还调用了其他的.jar包,则应该在CLASSPTH中进行相应的设置。
用JavaBuilder创建Java组件的步骤
为了创建组件您需要写好M-代码(或使用已有代码),然后在MATLAB的Java编译器中创建一个项目来对代码进行封装。
一般步骤如下:
1.编写、测试并保存用来创建Java组件的MATLAB代码。
2.对计算机的环境变量进行必要的设置。
详见SettingsforEnvironmentVariables(DevelopmentMachine)。
3.在MATLAB中,执行下列命令打开Deployment工具:
deploytool
4.用Deployment工具创建包含一个或多个类的项目。
a.点击工具栏上的新建项目图标创建项目。
b.设定项目名称和位置。
默认的项目名称为将要创建的包名。
您可以更改这一默认值。
c.为Java包中将要创建的类添加类名。
d.为每个类添加要封装到该类中的一个或多个M-文件。
e.根据需要为类添加辅助文件。
f.保存项目。
5.对包进行编译
在项目的编译过程中会复制项目的\src子目录下的Java包装类,同时复制项目\distrib子目录下的.jar文件和.ctf文件。
\distrib目录下的文件定义了您的Java组件。
.ctf文件是组件技术文件,在没有安装MATLAB桌面的用户机器上运行封装有MATLAB函数的组件时需要该文件。
6.对组件进行测试,根据需要对其进行重编译。
您或许想在将组件用于应用程序之前或准备提供给他人使用之前对其进行测试。
在您的开发平台上测试过组件后,您可以根据需要重新打开项目继续下一步操作。
7.创建一个包来将组件和其他必要文件发布给开发人员。
这一步骤仅当您想将组件供不同开发机器上的其他应用程序开发人员使用时才需要。
8.保存项目
JavaBuilder将项目保存到一个.prj文件中。
注:
上述内容翻译自MATLAB的帮助文件。
一个简单的例子
下面用taohe帖子[url]Builder在Java程序中调用该文件。
[size=3][b]MatlabCodes:
[/b][/size]
functiony=myadd(a,b)
y=a+b;
end
步骤如下:
1.在Editor中编写如上代码,并保存为myadd.m;
2.在CommandWindow中执行deploytool,打开Deploymenttool窗口。
3.点击Deploymenttool窗口工具栏最左边的新建图标,打开NewDeploymentProject对话框。
从左边选择“MATLABBuilderforJava”,得到如下画面:
4.Name栏填myadd.prj。
点击“Ok"按钮。
5.将myadd.m拖入myaddclass中,如下图所示。
然后点击工具栏上的保存按钮,保存项目。
6.点击Deploymenttool窗口工具栏上的BuildtheProject图标编译项目。
编译完成后在你的工作目录上会出现一个myadd文件夹,其中有两个名称分别为distrib和src的文件夹。
distrib中的文件就是JavaBuilder生成的可发布文件。
共有两个文件:
myadd.jar和myadd.ctf。
7.将MATLAB的当前目录切换到distrib目录。
用winrar等软件将myadd.jar“解压到当前文件夹”。
解压后你会看到两个文件夹:
META-INF和myadd。
如下图所示:
8.在Matlab的Editor中新建一文件。
输入下面的内容,并保存为MJBuilderTest.java。
(注意扩展名)
/*Necessarypackageimports*/
importcom.mathworks.toolbox.javabuilder.*;
importmyadd.*;
/*
*MJBuilderTestclasstestthemyaddclasscreatedbyJavaBuilder.The
*inputsarepassedonthecommandline.
*/
classMJBuilderTest
{
publicstaticvoidmain(String[]args)
{
MWNumericArraya=null; /*Storesinputvaluesa*/
MWNumericArrayb=null; /*Storesinputvaluesb*/
Object[]result=null; /*Storestheresult*/
myaddclassmyAdd=null; /*Storesmyaddclassinstance*/
try
{
/*检测输入变量*/
if(args.length!
=2)
{
System.out.println("Error:
mustinput2numbers!
");
return;
}
/*接收输入变量*/
a=newMWNumericArray(Double.valueOf(args[0]),MWClassID.DOUBLE);
b=newMWNumericArray(Double.valueOf(args[1]),MWClassID.DOUBLE);
/*创建myaddclass对象*/
myAdd=newmyaddclass();
/*计算并输出结果*/
result=myAdd.myadd(1,a,b);
System.out.print("\nThesumof"+a.toString()+"and"+b.toString()+"is:
");
System.out.println(result[0]);
}
catch(Exceptione)
{
System.out.println("Exception:
"+e.toString());
}
finally
{
/*Freenativeresources*/
MWArray.disposeArray(a);
MWArray.disposeArray(b);
MWArray.disposeArray(result);
if(myAdd!
=null)
myAdd.dispose();
}
}
}
9.在CommandWindow中执行如下代码进行编译:
!
javacMJBuilderTest.java
10.编译通过后,执行如下代码:
!
javaMJBuilderTest12
你将会看到如下结果:
Thesumof1add2is:
3
JAVA调用matlab
2010-09-2617:
15 794人阅读 评论
(2) 收藏 举报
前段时间摸索了java调用matlab东西,不说学的有多深,也算有结果了,达到目的了。
也即用java程序可以调用matlab中函数了。
按顺序说吧,最开始肯定是下个matlab看看。
下哪一个呢。
开始下一个7.0觉得很新了。
后来才觉得不是,现在都有7.8了。
同时网上还流传着另外一种版本号信息,即2006版、2006a版、2008b版,后来从网上找资料才知道,原来,matlab是一年两版的,叫a版和b版。
比如MATLAB7.2(Release2006a),我下的是m7.8即2009a版。
网上有对应关系,有兴趣可以找一下。
先说明一下,我用java调用matlab用的是matlab人提供的,MABLABBUILDERJA工具,还要告诉你,这工具2006b版以前是没有的,我想以前java可能通过JNI通过c来调用matlab的。
所以你下载时要注意版本了。
还有一点要说明下,如果你用的是AMD的处理器,不是intel的处理器,安装matlab后,可能不能运行,具体表现是,一打开就关闭了。
我公司机器用就是AMD的处理器,解决办法其实也很简单,就是给你的机器新建立一个系统变量,变量名是BLAS_VERSION,变量值是D:
//MATLAB7//bin//win32//atlas_Athlon.dll(你的matlab安装地址)。
然后,就是我们学着用MABLABBUILDERJA了,开始不知道看matlab帮助,只是从网上看别人写的东西,关于这样的文章基本上出自一个娘胎,我不明白的地方,都一样的没有。
后来看到了matlab帮助文档了,确实兴奋了一把,那才是最正宗的。
下面我就试着按照它的说明一步一步说一下。
先来,介绍一下MATLAB® Builder™JA吧,它是MATLAB® Compiler™的扩展产品,用它你可以把你的m-code文件包装起来,并打包到一个多个class文件中,这样的你的java程序就能用matlab了,其实是这样的,m-codeiv当然就是你想调用的matlab程序了。
要说明一点,如果你只是在安装matlab的机器上,用java调用运行由MATLAB® Builder™JA生成的jar包,当然可以。
如果你要在没有安装matlab的机器上用java调用这些jar包,怎么办?
也是可以的,不过,不过你要先在机器上安装matlab提供的MATLABCompilerRuntime(MCR),它的安装文件在C:
/ProgramFiles/MATLAB/R2009a/toolbox/compiler/deploy/win32下(你的安装目录下)文件名MCRInstaller.exe。
准备工作:
java环境,JAVA_HOME设置正确。
还有一点你jdk版本要是1.6以上的,1.5可能有错。
关键部分来了,在这部分你可以,通过一个例子,看到一个M-codefunction转变成为java可调用组件。
这个例子的名字叫,magicsquare,这个例子让你学会如何,创建一个叫magicsquare 的java组件,它主要包括一个 magic class,和一个jar文件,还有其它上些发布组件用到的文件。
magic .class是最关键的,就是它包装了,MATLAB的函数 makesqr, makesqr函数是计算魔方数组用的,后面我们就是java程序,调用这个函数。
MATLABBuilderJA,可以通过在matlab命令,deploytool 调出,在这之间,为了验证matlab已能得到你的java环境了,你可以用,getenvJAVA_HOME来验证一下,能返回你的JAVA_HOME就是正确的了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 没有 直接 调用 matlab 接口 函数