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

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

信息如下:

>> javaclasspath

		STATIC 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

4) 在Matlab中测试Dog

>> d1 = javaObject('Dog', 'martin')

d1 =

[email protected]

>> d1.setName('程序')
>> d1.getName()

ans =

程序_1

>> d1.getName()

ans =

程序_2

>> d1.getName()

ans =

程序_3

>> d2 = javaObject('Dog')

d2 =

[email protected]

>> d2.getName()

ans =

null_1

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

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

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

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

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

在Matlab中运行以下命令:

>> javaaddpath('/home/your_username/documents/matlab_java/Dog.jar')
>> d = javaObject('Dog', 'martin')

d =

[email protected]

>> d.getName()

ans =

martin_1

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

6) 查看Dog类的可用方法

>> methods Dog

Methods for class Dog:

Dog        getClass   hashCode   notify     setName    wait
equals     getName    main       notifyAll  toString

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

时间: 2024-11-08 13:24:46

使用GCJ编译Java程序供Matlab调用Java对象方法实践的相关文章

JAVA程序 写供别人调用的接口方法的时候 异常应该怎么处理?

要看出现的是哪种异常了.如果是使用某些定义好的函数,并且函数本身会产生异常处理方法一般两种:1.自己用try{}catch(){}语句捕获异常并处理.2.在定义接口的后面写上throw Exception.把异常抛出让使用接口的人处理异常.两种方法都可以.但如果是RuntimeException异常,那就是自己程序某些地方写错了,那你就必须找到并修改程序.JAVA程序 写供别人调用的接口方法的时候 异常应该怎么处理?,布布扣,bubuko.com

如何把js文件编译成dll供页面调用

1. 在解决方案中添加一个项目:JSControl 2. 在这个项目添加一个js文件(JScript1.js) 脚本的内容: function showAlert(){ alert('Today is a good dary'); } 3. 改变JScript1.js的属性,Build Action为Embedded Resource(嵌入的资源) 4. 在JSControl项目的AssemblyInfo.cs文件中添加一行:(注意JSControl.JScript1.js,JSControl是

分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)

原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ====================================================================== 原理讲解 1. 关于InputStream.read()      在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读

java native interface JNI 调用Java方法

在上一篇文章中介绍了JNI,以及java调用JNI,这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数.JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数. 下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数.每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对

java程序通过jdbc连接oracle数据库方法

1.  赋予scott用户连接权限:Grant connect to scott: 2.   在Myeclipse中新建java项目导入jdbc包(classes12.jar):        右键项目 bulid path -〉add external archives 选择classes12.jar 3.   新建java文件, lianxi01.java import java.sql.Connection; import java.sql.ResultSet; import java.s

黑马程序员--Objective-C类方法与对象方法、区别、与调用-我之见解

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 类方法. 1. 特点: 以加号( + )开头, 调用格式:  [类名  方法名] 类方法的好处:不需要创建实例对象,直 接通过类名访问,节省空间 ,提高了效率 2.注意事项: 类方法可以和实例方法同名, 相互之间互不影响 类方法可以从父类

Matlab调用外部库函数方法和注意事项

在MATLAB环境下访问外部函数的共享库文件,必须首先把该库文件加载到内存中.一旦加载成功,就 能直接在MATLAB中直接请求关于函数的任何信息.而当不再需要该库时,就应当及时把库文件从内存 中卸载以节省内存开销. 加载库 加载库加载库 加载库 语法:loadlibrary('shrlib','hfile') 其中shrlib为加载的动态链接库文件名(filename.dll),hfile为头文件名,它包含函数原型.例如,当加载包 含MATLAB中mx程序的libmx库时,可以使用下列语句. h

源码编译安装程序包及httpd源码安装实践

源码编译安装程序包从步骤并不复杂,实际安装过程中最主要的就是准备好编译环境:根据自己的实际需求,选择或设置程序包编译参数:以及程序包安装后的相关配置. 1.  编译环境准备 以CentOS6为例,一般通过yum安装2个包组,编译工具,以及编译程序包依赖的主要的头文件和库文件就都准备好了. # yum groupinstall "Development Tools" # yum groupinstall "Server Platform Development" 另外

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

第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还没有搭建环境变量的小伙伴请转移到上一篇的随笔中去完成搭建. 连接地址:http://www.cnblogs.com/hysum/p/7084380.html 现在我们可以通过使用记事本来编辑我们的第一个java小程序. 第一步 .使用记事本编辑程序代码 用记事本编写的是java的源代码文件,里面的代码就是我们平时学习的java代码.生成的文件后缀是.java