从MATLAB调用Java

我一直在使用Swig为用C ++编写的库创建Java包装器。 包装器生成一个包然后jar 。 文件编译正确并与java完美配合,但我无法从MATLAB中调用它。

我尝试在MATLAB中的静态Java路径文件中添加jar路径,然后调用jar文件中的类,但是我得到错误"Undefined variable or class.."或者如果我尝试使用javaObject(...) "No class * can be located on Java class path"

我不确定我做错了什么。


编辑:

为了测试从MATLAB调用c ++库,我创建了一个简单的“数据读取器”类,它包含一个将随机生成的vector< vector >写入文本文件的函数和一个读取它的函数。

生成的swig文件是: SimpleReader.javaDoubleVector.javaexampleJNI.javaexample.javacom.example.reader包中的DoubleVector2.java 。 这些被编译并打包到example.jar (生成的库dll也被打包到jar中)。

一切正常,从java调用它所以问题必须特定于MATLAB。 MATLAB没有太多代码,因为似乎没什么用。 我得到了

 javaclasspath('c:/reader/reader.jar'); obj = com.example.reader.SimpleReader; 

此时我得到'Undefined variable "com" or class "com.example.reader.SimpleReader"'

一般来说,你应该能够做到这一点:

 javaclasspath('/path/to/myjar.jar') myobj = com.example.mypackage.MyObject; myobj.someMethod(123); 

我已经在MATLAB上使用了很长一段时间并且没有遇到任何麻烦。 也许您可以发布您正在使用的确切MATLAB代码?


我得到了

 javaclasspath('c:/reader/reader.jar'); obj = com.example.reader.SimpleReader; 

此时我得到’Undefined variable“com”或class“com.example.reader.SimpleReader”’

好吧,对于初学者,你提到你的jar文件叫做example.jar ,但你的MATLAB代码引用了reader.jar – 你确定你在javaclasspath()引用的jar存在吗? 你试过看它的内容吗? (例如,使用7zip或任何可以读取.zip格式文件的程序,因为.jar文件只是带有附加规范的.zip格式文件)


嗯…

  • 您使用的是哪个版本的MATLAB?
  • 你的课程公开吗?
  • 当您尝试键入以下内容时,您会得到什么:

     javap -classpath c:/reader/example.jar com.example.reader.SimpleReader 

你说你使用的是7.0.4版本 – 这可能就是问题所在。 早期版本的MATLAB使用旧版本的Java JRE :

MATLAB仅在我们随MATLAB提供的JVM上得到完全支持。 例如:

适用于MATLAB 6.5.1的JVM 1.3.1(R13SP1)

适用于MATLAB 7.0.1的JVM 1.4.2(R14SP1)

MATLAB 7.0.4(R14SP2)及更高版本直到MATLAB 7.4(R2007a)使用JVM 1.5和MATLAB 7.5(R2007b),后来使用JVM 1.6。 在不同版本的JVM下,有些组件可能无法正常工作。

此时你基本上有三个选择。

  • (如果可能) – 仅使用与Java 5兼容的JAR文件。在这种情况下,由于您要创建自己的库,因此需要使用-target 1.5选项 。 ( target="1.5"如果你正在使用ant 任务)这通常不是一个大问题,因为1.6是1.5的一种增量改进 – 尽管如果你使用的是少数几个Java像ArrayDeque这样的6个类,或依赖于1.6的外部库,你运气不好。

  • 通过更改JVM , 将 JRE 1.6与Matlab 7.4一起使用。 不确定这是个好主意。

  • 将MATLAB升级到在Java 6(R2007b或更高版本)上运行的版本。

当您将Java开发环境升级到Java 7或Java 8时,请记住此问题。