从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.java
, DoubleVector.java
, exampleJNI.java
, example.java
, com.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时,请记住此问题。