1、java 中没有直接调用 matlab 的接口函数, 在通常的情况下我们是通过借用 C+作为中间过程来实现的,使用 C+主要是用 c 与 matlab 的结构实现 c 调用 matlab 的功能,将这些功能函数封装成 dll 文件,用 java 语言调用所生成的 dll 文件,从而实现了调用 matlab 的功能。java 调用 c 程序利用的是 java 的 jni 技术,即 java native interface。具体的过程为:1.首先,写一个类:public class EngstaticSystem.loadLibrary(“Eng“); / (1)public native vo
2、id 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-Opti
3、ons-Directories 中 engine.h 所在的路径,笔者所使用的路径为: C:JDK1.5.0INCLUDE,在这个对话框中的“Show directories for:“的下拉菜单中选择 Library Files,然后添加库文件的路径,在笔者的计算机上的路径是:E:MATLABEXTERNLIBWIN32MICROSOFTMSVC60。(2)Project-Settings-Link 在 Object/Library Modules 中加上库文件连接:也就是自己手动添加三个文件分别是:libmx.lib libmex.lib libeng.lib(3)将通过 javah 生成
4、的 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 Areal6=1,2,3,4,5,6;JNIEXP
5、ORT void JNICALL Java_Eng_plottest(JNIEnv * eng, jobject obj)Engine * ep;mxArray * T=NULL,*a=NULL,*d=NULL;char buffer30;double *Dreal,*Dimag;double time10=0,1,2,3,4,5,6,7,8,9;if (!(ep=engOpen(NULL) MessageBox(HWND)NULL,(LPSTR)“cant start Matlab engine“,(LPSTR)“Engwindemo.c“,MB_OK);exit(-1);T=mxCreat
6、eDoubleMatrix(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);“)
7、;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“);engClos
8、e(ep);if (d=NULL) MessageBox(HWND)NULL,(LPSTR)“Get Array Failed“,(LPSTR)“Engwindemo.c“,MB_OK);elseDreal=mxGetPr(d);Dimag=mxGetPi(d);if (Dimag) sprintf(buffer,“Eigenval 2:%g+%gi“,Dreal1,Dimag1);elsesprintf(buffer,“Eigenval 2:%g“,Dreal1);MessageBox(HWND)NULL,(LPSTR)buffer,(LPSTR)“Engwindemo.c“,MB_OK);
9、mxDestroyArray(d);mxDestroyArray(T);mxDestroyArray(a);编译这个工程在 Debug 文件夹中生成一个 Eng.dll 的文件3.编写一个测试的 java 文件:/* testEng.java */public class testEngpublic static void main(String args)Eng ad=new Eng();ad.plottest();同时将生成的 Eng.dll 文件和这个 testEng.java 放在同一个目录中,在 dos 环境下编译运行这个 java 程序。效果就出来了。根据预测系统的需要,现在希望能
10、在 Java 中直接调用 Matlab 的函数。但,搜索几时,找到的都是在 Matlab 中调用 java 的方法,只看到如下一篇文章中提到:在 Matlab 的新版中提供了此功能的初体验!但最新版的 Matlab 是必不太好找,只好想法用 java 的 jni 接口,调用 C,使用 C 去调用Matlab 了。这样效率就牺牲了,真是没辙!【原创】Java Builder 初体验本文节选自:http:/ 11:43 作者:junziyangMATLAB 的最新版本 2006b 中新添了一个产品MATLAB Builder for Java。其实本来Matlab 就有 Java 外部程序接口,不
11、过原来的接口只能在.m 文件中调用 Java,而无法在 Java 程序中调用 Matlab。新的 Java Builder 为我们在 Java 程序中调用 Matlab 丰富的数值计算资源提供了极大的便利。与 MATLAB 对其他程序的外部接口相比,我觉得 Java 接口在一下几个方面比较有特色:(1 )在.m 文件中可以直接调用 Java 资源。例如可以调用 JDK 中的界面元素构建用户界面。(2 )可以利用 Java 在网络功能方面的优势,开发基于 Web 的应用程序。由于 Java Builder 是个新产品,我也是相应 bainhome 版主的号召,现炒现卖 :),旨在抛砖引玉,引发有
12、兴趣的网友的共同讨论。错误之处敬请批评指正。什么是 MATLAB Builder for Java?MATLAB Builder for Java(又叫 Java Builder)是对 MATLAB Compiler 的扩展。用 Java Builder 可以将 MATLAB 函数包装到一个或多个 Java 类中形成一个 Java 组件或包。每个MATLAB 函数被封装为 Java 类的一个方法,可以在 Java 应用程序中被调用。环境变量设置为了使用 Java Builder 来进行开发,你的计算机上必须安装有 JDK,而且必须对自己计算机的环境变量进行必要的设置,具体步骤如下:(1)点击
13、开始-右击“我的电脑 ”,选择“属性”。在弹出的 “系统属性” 对话框中选择“高级” 标签,然后点击下发的“环境变量”按钮。(2)设置 JAVA_HOME 变量a. 点击弹出的对话框中上方的“新建”按钮;b. 变量名: JAVA_HOME;c. 变量值:JDK 的安装目录,需要设置为 javac.exe 的上一层目录。例如我的机器上javac.exe 在 C:SunAppServerjdkbin 中,那么 JAVA_HOME 的变量值应设为C:SunAppServerjdk。d. 点击 “确定”。(3)设置 CLASSPATH 变量a. 点击 “新建”b. 变量名: CLASSPATHc. 变
14、量值:.;matlabroottoolboxjavabuilderjarjavabuilder.jar; d. 点击 “确定” 。(4)“ 确定 ”,“确定” ,退出属性设置。说明:进行完上述设置后就可以用 Java Builder 简单的开发了。但需要说明的是,如果你的 Java程序中还调用了其他的.jar 包,则应该在 CLASSPTH 中进行相应的设置。用 Java Builder 创建 Java 组件的步骤为了创建组件您需要写好 M-代码(或使用已有代码),然后在 MATLAB 的 Java 编译器中创建一个项目来对代码进行封装。一般步骤如下:1. 编写、测试并保存用来创建 Java
15、组件的 MATLAB 代码。2. 对计算机的环境变量进行必要的设置。详见 Settings for Environment Variables (Development Machine)。3.在 MATLAB 中,执行下列命令打开 Deployment 工具:deploytool4.用 Deployment 工具创建包含一个或多个类的项目。a. 点击工具栏上的新建项目图标创建项目。b. 设定项目名称和位置。默认的项目名称为将要创建的包名。您可以更改这一默认值。c. 为 Java 包中将要创建的类添加类名。d. 为每个类添加要封装到该类中的一个或多个 M-文件。e. 根据需要为类添加辅助文件。f
16、. 保存项目。5. 对包进行编译在项目的编译过程中会复制项目的src 子目录下的 Java 包装类,同时复制项目distrib 子目录下的.jar 文件和.ctf 文件。distrib 目录下的文件定义了您的 Java 组件。.ctf 文件是组件技术文件,在没有安装 MATLAB 桌面的用户机器上运行封装有 MATLAB 函数的组件时需要该文件。6. 对组件进行测试,根据需要对其进行重编译。您或许想在将组件用于应用程序之前或准备提供给他人使用之前对其进行测试。在您的开发平台上测试过组件后,您可以根据需要重新打开项目继续下一步操作。7. 创建一个包来将组件和其他必要文件发布给开发人员。这一步骤仅
17、当您想将组件供不同开发机器上的其他应用程序开发人员使用时才需要。 8. 保存项目Java Builder 将项目保存到一个.prj 文件中。注:上述内容翻译自 MATLAB 的帮助文件。一个简单的例子下面用 taohe 帖子urlhttp:/ m 文件,来演示如何通过 Java Builder 在 Java 程序中调用该文件。size=3bMatlab Codes:/b/sizefunction y = myadd(a, b)y = a+b;end步骤如下:1. 在 Editor 中编写如上代码,并保存为 myadd.m;2. 在 Command Window 中执行 deploytool,打
18、开 Deployment tool 窗口。3. 点击 Deployment tool 窗口工具栏最左边的新建图标,打开 New Deployment Project 对话框。从左边选择“MATLAB Builder for Java”,得到如下画面:4. Name 栏填 myadd.prj。点击“Ok“ 按钮。5. 将 myadd.m 拖入 myaddclass 中,如下图所示。然后点击工具栏上的保存按钮,保存项目。6. 点击 Deployment tool 窗口工具栏上的 Build the Project 图标编译项目。编译完成后在你的工作目录上会出现一个 myadd 文件夹,其中有两个名
19、称分别为 distrib 和 src 的文件夹。distrib中的文件就是 Java Builder 生成的可发布文件。共有两个文件:myadd.jar 和 myadd.ctf。7. 将 MATLAB 的当前目录切换到 distrib 目录。用 winrar 等软件将 myadd.jar “解压到当前文件夹” 。解压后你会看到两个文件夹:META-INF 和 myadd。如下图所示:8. 在 Matlab 的 Editor 中新建一文件。输入下面的内容,并保存为 MJBuilderTest.java。 (注意扩展名)/* Necessary package imports */import c
20、om.mathworks.toolbox.javabuilder.*;import myadd.*;/* MJBuilderTest class test the myadd class created by Java Builder. The* inputs are passed on the command line.*/class MJBuilderTestpublic static void main(String args)MWNumericArray a = null; /* Stores input values a */MWNumericArray b = null; /* S
21、tores input values b */Object result = null; /* Stores the result */myaddclass myAdd = null; /* Stores myadd class instance */try/* 检测输入变量 */if (args.length != 2)System.out.println(“Error: must input 2 numbers!“);return;/* 接收输入变量 */a = new MWNumericArray(Double.valueOf(args0),MWClassID.DOUBLE);b = n
22、ew MWNumericArray(Double.valueOf(args1),MWClassID.DOUBLE);/* 创建 myaddclass 对象 */myAdd = new myaddclass();/* 计算并输出结果 */result = myAdd.myadd(1, a, b);System.out.print(“nThe sum of “ + a.toString() + “ and “ + b.toString() + “ is: “);System.out.println(result0);catch (Exception e)System.out.println(“Ex
23、ception: “ + e.toString();finally/* Free native resources */MWArray.disposeArray(a);MWArray.disposeArray(b);MWArray.disposeArray(result);if (myAdd != null)myAdd.dispose();9. 在 Command Window 中执行如下代码进行编译:!javac MJBuilderTest.java10. 编译通过后,执行如下代码:!java MJBuilderTest 1 2你将会看到如下结果:The sum of 1 add 2 is:
24、 3JAVA 调用 matlab2010-09-26 17:15 794 人阅读 评论(2) 收藏 举报前段时间摸索了 java 调用 matlab 东西,不说学的有多深,也算有结果了,达到目的了。也即用java 程序可以调用 matlab 中函数了。按顺序说吧,最开始肯定是下个 matlab 看看。下哪一个呢。开始下一个 7.0 觉得很新了。后来才觉得不是,现在都有 7.8 了。同时网上还流传着另外一种版本号信息,即 2006 版、 2006a 版、2008b 版,后来从网上找资料才知道,原来, matlab 是一年两版的,叫 a 版和 b 版。比如MATLAB 7.2 (Release 2
25、006a),我下的是 m7.8 即 2009a 版。网上有对应关系,有兴趣可以找一下。先说明一下,我用 java 调用 matlab 用的是 matlab 人提供的,MABLAB BUILDER JA 工具,还要告诉你,这工具 2006b 版以前是没有的,我想以前 java 可能通过 JNI 通过 c 来调用 matlab 的。所以你下载时要注意版本了。还有一点要说明下,如果你用的是 AMD 的处理器,不是 intel 的处理器,安装 matlab 后,可能不能运行,具体表现是,一打开就关闭了。我公司机器用就是 AMD 的处理器,解决办法其实也很简单,就是给你的机器新建立一个系统变量,变量名是
26、BLAS_VERSION,变量值是 D:/MATLAB7/bin/win32/atlas_Athlon.dll(你的 matlab 安装地址)。然后,就是我们学着用 MABLAB BUILDER JA 了,开始不知道看 matlab 帮助,只是从网上看别人写的东西,关于这样的文章基本上出自一个娘胎,我不明白的地方,都一样的没有。后来看到了matlab 帮助文档了,确实兴奋了一把,那才是最正宗的。下面我就试着按照它的说明一步一步说一下。先来,介绍一下 MATLAB Builder JA 吧,它是 MATLAB Compiler的扩展产品,用它你可以把你的 m-code 文件包装起来,并打包到一个
27、多个 class 文件中,这样的你的 java 程序就能用matlab 了,其实是这样的,m-codeiv 当然就是你想调用的 matlab 程序了。要说明一点,如果你只是在安装 matlab 的机器上,用 java 调用运行由 MATLAB Builder JA 生成的 jar 包,当然可以。如果你要在没有安装 matlab 的机器上用 java 调用这些 jar 包,怎么办?也是可以的,不过,不过你要先在机器上安装 matlab 提供的 MATLAB Compiler Runtime (MCR),它的安装文件在C:/Program Files/MATLAB/R2009a/toolbox/c
28、ompiler/deploy/win32 下(你的安装目录下)文件名MCRInstaller.exe。准备工作:java 环境,JAVA_HOME 设置正确。还有一点你 jdk 版本要是 1.6 以上的,1.5 可能有错。关键部分来了,在这部分你可以,通过一个例子,看到一个 M-code function 转变成为 java 可调用组件。这个例子的名字叫,magic square,这个例子让你学会如何,创建一个叫 magicsquare 的 java组件,它主要包括一个 magic class,和一个 jar 文件,还有其它上些发布组件用到的文件。magic .class 是最关键的,就是它包
29、装了, MATLAB 的函数 makesqr, makesqr 函数是计算魔方数组用的,后面我们就是 java 程序,调用这个函数。MATLAB Builder JA,可以通过在 matlab 命令,deploytool 调出,在这之间,为了验证matlab 已能得到你的 java 环境了,你可以用, getenv JAVA_HOME 来验证一下,能返回你的JAVA_HOME 就是正确的了。这个例子的,m 代码和 java 代码,matlab 都帮我们写好了。你现在需要做的就是把它的代码拷贝你的工作空间中,它是例子在matlabroot /toolbox/javabuilder/Example
30、s/MagicSquareExample .matlabroot 就是 matlab 的安装目录。拷贝 MagicSquareExample 这个文件夹到你工作空间, for example, D:/javabuilder_examples记得不要有空格。把 MagicSquareExample 子目录改名为 magic_square,现在的文件结构应该是 D:/javabuilder_examples/magic_square .没错的话。然后把 matlab工作空间转到 D:/javabuilder_ examples/magic_square。 最后,要用 m-code function
31、我们要先测试它,打开 makesqr.m 文件,然后在 matlab 命令行中,输入 makesqr(5),看看结果是不是17 24 1 8 15deploytool 调出 MATLAB Builder JA,它应该是如下这个样子,然后你选择 MATLAB BUILDER JA,新建一个工作,点击 Browse 按钮把你的工作放在D:/javabuilder_examples/magic_square.输入 magicsquare 作为工程名称。默认工程名字也是D:/javabuilder_examples/magic_square 目录下的包名。MATLAB Builder JA 分配 cl
32、asses 存放的文件夹名是按工程名称来设置的,所以在本工作中,Magicsquare 就是作为,calsses 存放目录名称了,我们要手动改它名字为,class,直接右击就可以改了。(这也是我以前看别人文章的,老找不到他们所谓的 class 文件夹的原因,也没人说这个问题)工作建好以后,你可以 setting 你的工程,matlab 的指南上说,让我们把Generate Verbose Output 选项选上,这样就能看到出错信息,实际上它默认是选择的。然后,把 m 文件添加到工程中,在 matalb 中找到 makesqr.m 文件把它,用鼠标拖到工程的 magic 文件夹下。然后保存工程
33、。下面就是构建工程,点击面板上方 按钮,等待一会,matlab 就会你的工程目录下,创建 src 和 distrib 两个文件夹。 src 目录中包括有,生成的 java文件,magic.class。distrib 目录中包括有 java 存档文件,magicsquare.jar。23 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9下面就是把 m-code 函数创建成一个 java 组件。用刚才说的,接下来,就是验证你用 matlab builder ja 生成的 java 组件是不是能用的时候了。先在你的 java ide 中建立一个 java
34、工程,然后把刚才生成的 magicsquare.jar,还有,matlabroot/toolbox/javabuilder/jar/javabuilder.jar 加入你的 java 工程构建路径中去。然后你把 D:/javabuilder_examples/magic_square/MagicDemoJavaApp 下的getmagic.java 测试文件拷贝到你 java 工程下,然后直接运行它。具体是怎么调用的,你看一测试代码就知道了,很 easy.就可以测试了。它是提示你输入一个数。如输入 5,回车得到Magic square of order 5 17 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9就正确了。