1 引言

以Matlab作为开发平台,进行数值计算,具有直接、高效的特点。

然而,在面向对象程序设计方面,现有的Matlab支持特性在开发和运行效率上并不高。

将Java语言面向对象及其平台特性引入Matlab,能够拓展其模型表达能力与手段。此外,Java本身的特性,也决定了其具有良好的开发性能。

与C语言编写mex动态链接库的开发目的不同(mex主要以速度见长),基于Java的matlab扩展能为matlab带来更大的灵活性。甚至于,Java平台下更多的类库,能够丰富matlab平台功能。

2 Java编译器的选择

测试平台:麒麟14.04 64bits

Matlab版本:13a

Java环境:Oracle sun jdk8 和 Gnu gcj

搜索了网络上的参考资料,其中,就Matlab中java静态和动态类搜索路径的设置阐述得多,但具体使用jdk8实验都没有成功——当加载自定义类的时候,matlab报错

<span style="color:#3333FF;">>> d = javaObject('Dog')</span>
A Java exception occurred trying to load the Dog class:
Java exception occurred:
java.lang.UnsupportedClassVersionError: Dog : <span style="color:#FF0000;">Unsupported major.minor version 52.0</span>at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.access$000(Unknown Source)at java.net.URLClassLoader$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClassInternal(Unknown Source)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Unknown Source)at com.mathworks.jmi.OpaqueJavaInterface.findClass(OpaqueJavaInterface.java:470)
Error using javaObject
No class Dog can be located on the Java class path

分析,主要原因是Java版本过高,与Matlab所使用的Java版本不适应。

查看Matlab中的Java版本

>> version -java

ans =

Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) 64-Bit Server VM mixed mode

经javac -target 1.6 xxx.java测试,显示javac: 目标发行版 1.6 与默认的源发行版 1.8 冲突; 无法使用当前javac编译器产生Matlab需要版本的类。

鉴于一些帖子中提到使用GNU gcj编译器,故安装该编译器测试:

安装方法为:

sudo apt-get install gcj-jdk

安装后gcj-jdk版本为4.8

3 使用gcj-jdk编译Java类

3.1 测试代码Dog.java

class Dog {private String name;private Integer count;public Dog() {name = null;count = 0; }public Dog(String aname) {count = 0;name = aname;}public String getName() {count++;return name + "_" + count.toString();}public void setName(String newName) {name = newName;}public static void main(String[] args) {Dog d = new Dog("martin chen");System.out.println(d.getName());}
}

为便于调试和在Matlab中测试,没有使用package。

3.2 代码编译

gcj -C Dog.java

产生了Dog.class

压缩Dog.class到Dog.jar,为了简化操作,不写manifest.mf文件,直接压缩

jar cvf Dog.jar Dog.class

3.3 Matlab中Java类搜索路径设置

1) 查看Matlab中现有的类路径命令,可以看到其内置可加载的Java类以及动态类加载信息

javaclasspath

信息如下:

>> javaclasspathSTATIC JAVA PATH/usr/local/MATLAB/R2013a/java/patch                                                       /usr/local/MATLAB/R2013a/java/jarext/jaxen.jar                                            /usr/local/MATLAB/R2013a/java/jarext/xstream.jar
省略...            /usr/local/MATLAB/R2013a/java/jarext/commons-io.jar                                       /usr/local/MATLAB/R2013a/java/jar/toolbox/dastudio.jar                                    /usr/local/MATLAB/R2013a/java/jarext/freehep-util.jar                                     /usr/local/MATLAB/R2013a/java/jarext/RXTXcomm.jar                                         /usr/local/MATLAB/R2013a/java/jar/instutil.jar                                            /usr/local/MATLAB/R2013a/java/jar/toolbox/instrument.jar                                  /usr/local/MATLAB/R2013a/java/jarext/openxml4j.jar                                                                                         DYNAMIC JAVA PATH<empty>

2) 在Matlab中查看静态路径存储文件的位置

which classpath.txt

结果:

/usr/local/MATLAB/R2013a/toolbox/local/classpath.txt

3) 编辑该classpath.txt,添加Dog.jar到静态路径中

sudo gedit /usr/local/MATLAB/R2013a/toolbox/local/classpath.txt

在文件尾添加

/home/your_username/matlab_java/Dog.jar

如果不想使用jar文件,可将class文件所在路径加入,例如:

/home/your_username/matlab_java

4 在Matlab中测试Dog

1)静态路径设置下的类测试

>> d1 = javaObject('Dog', 'martin')d1 =Dog@58d6147e>> d1.setName('程序')
>> d1.getName()ans =程序_1>> d1.getName()ans =程序_2>> d1.getName()ans =程序_3>> d2 = javaObject('Dog')d2 =Dog@58762acf>> d2.getName()ans =null_1

说明:d1和d2创建时,分别调用了Dog的两种构造函数。

测试结果表明,Java类被正确加载和调用了。

2)在Matlab中动态加载类并调用它

开发过程中,由于需要不断修改代码,故调试期间,可采用动态加载方式,加载用户自定义类。

重新编辑classpath.txt文件,去除Dog.jar的加载信息。

在Matlab中运行以下命令:

注意:如果不想使用jar文件,可将class文件所在路径加入,例如:/home/your_username/matlab_java

>> javaaddpath('/home/your_username/documents/matlab_java/Dog.jar')
>> d = javaObject('Dog', 'martin')d =Dog@65fe58e0>> d.getName()ans =martin_1

实验结果也说明Dog被正确加载和调用。

3) 查看Dog类的可用方法

>> methods DogMethods for class Dog:Dog        getClass   hashCode   notify     setName    wait
equals     getName    main       notifyAll  toString

5 Java代码的修改与Matlab中的重新载入类

修改java代码并编译后,可以在matlab中运行命令

clear java

将自动清除java对象及已装载的类

此时,重新创建对象,即可执行新修改代码的功能。

Ok,经过上述实验,大家终于可以放心和自由地在Matlab中使用Java了。

使用GCJ编译Java程序供Matlab调用Java对象方法实践相关推荐

  1. as3调用java_关于openamf我用as3链接java程序,并调用相关的方法,但是能够连上,却不能够调用是怎么回事...

    我用的openamf做flashremoting服务器是没问题的!这是as的代码!package{importflash.display.Sprite;importflash.net.ObjectEn ...

  2. c 调用java程序_C ++可以调用Java代码吗?

    小编典典 是的,您当然可以.这是一个例子: 这是java文件: public class InvocationHelloWorld { public static void main(String[] ...

  3. matlab将cpp编译为dll,Matlab函数编译成dll供Cpp调用的方法图解教程

    曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用. 以前做过matlab7与c++的混合 ...

  4. matlab调用Java程序时出现 Java.lang.OutOfMemoryErrot: GC overhead limit exceeded

    matlab调用Java程序时出现 java.lang.OutOfMemoryError: GC overhead limit exceeded JDK1.6.0_37和JDK_1.7.0_60版本, ...

  5. java编译程序的基本命令是什么,【填空题】Java中编译java 程序的命令是 1 ,执行java程序的命令是 java 。...

    [填空题]Java中编译java 程序的命令是 1 ,执行java程序的命令是 java . 更多相关问题 [多选] 下列骨折中属于关节外骨折的是(). [多选] 骨折早期局部的并发症包括(). [多 ...

  6. 在php中调用java接口吗,php 调用 java 接口

    php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...

  7. java中函数的调用,java中如何调用函数

    java动态调用函数,Java 中使用动态代码,java函数调用,java中如何调用函数 如何在 Java 中调用 C 函数 宗薇 [期刊名称]<网络新媒体技术> [年(卷),期]2000 ...

  8. 编写运行最简单的java程序——使用记事本编写java程序

    编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...

  9. 将Java程序变成可执行文件的一个简单方法

    将Java程序变成可执行文件的一个简单方法 运行Java程序(SWING或SWT的桌面程序)可以直接执行.class文件或将所有的.class文件及相关的其他文件压缩成.jar文件,然后使用javaw ...

  10. java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

    这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...

最新文章

  1. 如何使用YUM列出包的内容?
  2. GIS输出PDF为什么标注有问题
  3. 复练-软考网规-IDS和IPS概念、分类、评价标准
  4. 计算机ip变,为什么电脑IP地址总是自动改变
  5. android禁止屏幕自动旋转_Android 禁止屏幕旋转 屏幕旋转不刷新 Activity 动态更改屏幕方向...
  6. rstudio中读取数据_Rstudio操作数据库
  7. 计算平均指令时间_上海原油期货将推出TAS指令
  8. 如何快速将aac转换mp3
  9. Python下数值型与字符型类别变量独热编码(One-hot Encoding)实现
  10. 利用计算思维解决问题人和计算机都能完成,对计算思维能力养成与大学计算机基础课程改革的思考...
  11. 云栖科技评论第62期:想象力比雄心更重要
  12. IDEA安装中文语言包
  13. java获取上级菜单_java在多菜单中返回上级菜单如何实现
  14. c语言停车场管理系统答辩ppt,停车场管理系统C语言实现,全动画模拟
  15. bzoj1001/BJOI2006 狼抓兔子
  16. 服务器拥挤怎么修复,教你一招:有效解决网络拥挤的办法!
  17. 华为5G商用全球首例 深圳地铁车地超宽带通讯
  18. Moto XT800 获取root权限
  19. 小米8融合位置服务器,小米融合云组崔建伟 - 小米融合云实践
  20. Do not use empty rulesetscss(emptyRules) html入门篇

热门文章

  1. Java枚举类与常用方法
  2. 1507. 旅行计划
  3. 大数据平台架构有哪些
  4. re 中 报错 no such group
  5. 缓存块着色算法和优化的缓存块着色算法
  6. PHP 将百度地图上的一条线的点位进行平滑处理,画出一条曲线
  7. 计算机无法新建文件夹,win7系统不能新建文件夹的解决方法图文)
  8. [洛谷] P3174 [HAOI2009]毛毛虫 (树形dp 树的最长直径的扩展)
  9. word插入公式/endnote
  10. 合宙 4G模块Air720D Mini PCI-E 开发教程