导读:根据预测系统的需要,现在希望能在Java中直接调用Matlab的函数。但,搜索几时,找到的都是在Matlab中调用java的方法,只看到如下一篇文章中提到:在Matlab的新版中提供了此功能的初体验! 但最新版的Matlab是必不太好找,只好想法用java的jni接口,调用C,使...
根据预测系统的需要,现在希望能在Java中直接调用Matlab的函数。但,搜索几时,找到的都是在Matlab中调用java的方法,只看到如下一篇文章中提到:在Matlab的新版中提供了此功能的初体验! 但最新版的Matlab是必不太好找,只好想法用java的jni接口,调用C,使用C去调用Matlab了。这样效率就牺牲了,真是没辙!
【原创】Java Builder 初体验
本文节选自:http://hi.baidu.com/qiaonancn/blog/item/93f740daee1e2cdab7fd486d.html
2006-10-19 11:43 作者:junziyang
MATLAB的最新版本2006b中新添了一个产品-MATLAB Builder for Java。其实本来Matlab就有Java外部程序接口,不过原来的接口只能在.m文件中调用Java,而无法在Java程序中调用Matlab。新的Java Builder为我们在Java程序中调用Matlab丰富的数值计算资源提供了极大的便利。
与MATLAB对其他程序的外部接口相比,我觉得Java接口在一下几个方面比较有特色:
(1)在.m文件中可以直接调用Java资源。例如可以调用JDK中的界面元素构建用户界面。
(2)可以利用Java在网络功能方面的优势,开发基于Web的应用程序。
由于Java Builder是个新产品,我也是相应 bainhome版主的号召,现炒现卖:),旨在抛砖引玉,引发有兴趣的网友的共同讨论。错误之处敬请批评指正。
什么是MATLAB Builder for Java?
MATLAB Builder for Java(又叫Java Builder)是对MATLAB Compiler的扩展。用Java Builder可以将MATLAB函数包装到一个或多个Java类中形成一个Java组件或包。每个MATLAB函数被封装为Java类的一个方法,可以在Java应用程序中被调用。
环境变量设置
为了使用Java Builder来进行开发,你的计算机上必须安装有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)“确定”,“确定”,退出属性设置。
说明:进行完上述设置后就可以用Java Builder简单的开发了。但需要说明的是,如果你的Java程序中还调用了其他的.jar包,则应该在CLASSPTH中进行相应的设置。
用Java Builder创建Java组件的步骤
为了创建组件您需要写好M-代码(或使用已有代码),然后在MATLAB的Java编译器中创建一个项目来对代码进行封装。一般步骤如下:
1. 编写、测试并保存用来创建Java组件的MATLAB代码。
2. 对计算机的环境变量进行必要的设置。详见Settings for Environment Variables (Development Machine)。
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. 保存项目
Java Builder将项目保存到一个.prj文件中。
注:上述内容翻译自MATLAB的帮助文件。一个简单的例子
下面用taohe帖子http://www.simwe.com/forum/thread-746989-1-2.html中同样m文件,来演示如何通过Java Builder在Java程序中调用该文件。
Matlab Codes:
function y = myadd(a, b)
y = a+b;
end
步骤如下:
1. 在Editor中编写如上代码,并保存为myadd.m;
2. 在Command Window中执行deploytool,打开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文件夹,其中有两个名称分别为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 com.mathworks.toolbox.javabuilder.*;
import myadd.*;
/*
* MJBuilderTest class test the myadd class created by Java Builder. The
* inputs are passed on the command line.
*/
class MJBuilderTest
{
public static void main(String[] args)
{
MWNumericArray a = null; /* Stores input values a */
MWNumericArray b = null; /* Stores 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(args[0]),MWClassID.DOUBLE);
b = new MWNumericArray(Double.valueOf(args[1]),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(result[0]);
}
catch (Exception e)
{
System.out.println("Exception: " + 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.java
10. 编译通过后,执行如下代码:
!java MJBuilderTest 1 2