junziyang 发表于 2006-10-19 11:43:16

【原创】Java Builder 初体验

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版主的号召,现炒现卖:),旨在抛砖引玉,引发有兴趣的网友的共同讨论。错误之处敬请批评指正。

junziyang 发表于 2006-10-19 11:45:15

什么是MATLAB Builder for Java?

MATLAB Builder for Java(又叫Java Builder)是对MATLAB Compiler的扩展。用Java Builder可以将MATLAB函数包装到一个或多个Java类中形成一个Java组件或包。每个MATLAB函数被封装为Java类的一个方法,可以在Java应用程序中被调用。

junziyang 发表于 2006-10-19 12:10:57

环境变量设置

为了使用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中进行相应的设置。

[ 本帖最后由 junziyang 于 2006-10-19 12:44 编辑 ]

junziyang 发表于 2006-10-19 12:53:44

用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的帮助文件。

junziyang 发表于 2006-10-19 12:55:45

一个简单的例子

下面用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”,得到如下画面:

[ 本帖最后由 junziyang 于 2006-10-19 17:23 编辑 ]

junziyang 发表于 2006-10-19 17:32:37

一个简单的例子(续)

4. Name栏填myadd.prj。点击“Ok"按钮。
5. 将myadd.m拖入myaddclass中,如下图所示。然后点击工具栏上的保存按钮,保存项目。

junziyang 发表于 2006-10-19 17:36:06

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。如下图所示:

[ 本帖最后由 junziyang 于 2006-10-19 17:44 编辑 ]

junziyang 发表于 2006-10-19 17:47:02

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),MWClassID.DOUBLE);
            b = new MWNumericArray(Double.valueOf(args),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);
      }
      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();
      }
    }
}

junziyang 发表于 2006-10-19 17:50:28

9. 在Command Window中执行如下代码进行编译:
                !javac MJBuilderTest.java

10. 编译通过后,执行如下代码:
                !java MJBuilderTest 1 2

   你将会看到如下结果:
               The sum of 1 add 2 is: 3

taohe 发表于 2006-10-19 20:35:00

热烈鼓掌和支持。测试了一下,成功!不过我为了区分开,我把这个例子的工程名字改成了myaddjava,为此也改了MJBuildertest.java里相应的声明。程序运行正常。

谢谢!

shunfly 发表于 2006-10-19 22:02:19

楼主的帖子翻过一些
很是有收获,可惜我不懂JAVA以及混编
问下楼主:
MATLAB中的UITAB,UITABLE等一些暂时没有放开的函数,楼主有没有用过
因为这些都是基于JAVA的(不知道这种表述对不对)
至少数据结构都是JAVA的
help不到信息
到是edit可以得到信息

junziyang 发表于 2006-10-20 11:14:27

不好意思,没用过uitab和uitable。我用edit查看了一下这两个函数的代码,是用到了java。help中没有相关的帮助信息,我想可能是由于这两个函数还不成熟吧。在将来的版本中可能会公开。

原帖由 shunfly 于 2006-10-19 22:02 发表
楼主的帖子翻过一些
很是有收获,可惜我不懂JAVA以及混编
问下楼主:
MATLAB中的UITAB,UITABLE等一些暂时没有放开的函数,楼主有没有用过
因为这些都是基于JAVA的(不知道这种表述对不对)
至少数据结构都是 ...

shunfly 发表于 2006-10-20 15:05:26

我也是最近用GUI的时候偶尔TAB知道这些函数的
包括UITREE等等,NEWSGROUPS上也没有什么讨论
总之,感谢你的回复

bluky 发表于 2006-11-27 22:34:18

感谢楼主

这几天正要研究这个呢
就看到了楼主的杰作
真是谢谢!!!!!

呵呵 加油!!

litiansheng 发表于 2007-9-19 11:23:12

问题

不知为什么我在matlab输入deploytool 就提示Undefined function or variable 'deploytool'.   是不是还要装点什么呢
麻烦给个解答。

bainhome 发表于 2007-9-19 11:59:49

回复 #15 litiansheng 的帖子

版本太低,用r2006b以上试试,记得从前7.1里似乎是dotnettool,后来命令名称做了调整。

steppenwolf 发表于 2007-9-19 17:49:15

好贴,学习了楼主直接在MATLAB下编写并编译java文件,本以为要用Netbean或Visual Studio等JAVA IDE来做的,看来还可以简化至此。

005001008 发表于 2007-9-20 15:11:51

哈哈,长见识

litiansheng 发表于 2007-9-21 09:31:09

回复bainhome

我用的是matlab 7.0呀!


==========================

请看清楚我写的内容。
         bainhome

==========================

[ 本帖最后由 bainhome 于 2007-9-21 13:32 编辑 ]

pazzini 发表于 2008-12-10 11:35:04

>> !javac MJBuilderTest.java
错误: 读取 D:\My Documents\MATLAB\MJBuilderTest.java 时出错;error in opening zip file
MJBuilderTest.java:3: 软件包 myadd 不存在
import myadd.*;
^
MJBuilderTest.java:15: 找不到符号
符号: 类 myaddclass
位置: 类 MJBuilderTest
      myaddclass myAdd = null;   /* Stores myadd class instance */
      ^
MJBuilderTest.java:29: 找不到符号
符号: 类 myaddclass
位置: 类 MJBuilderTest
            myAdd = new myaddclass();
                        ^
4 错误


按照楼主的步骤进行的,还是报错了,咋回事呢:L
页: [1] 2
查看完整版本: 【原创】Java Builder 初体验