从MATLAB调用Java

ssa*_*muu 7 java matlab swig class wrapper

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

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

我不确定我做错了什么.


编辑:

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

产生的痛饮文件是:SimpleReader.java,DoubleVector.java,exampleJNI.java,example.java,DoubleVector2.java在包com.example.reader.这些被编译和打包example.jar(生成的库dll也被打包到jar中).

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

javaclasspath('c:/reader/reader.jar');
obj = com.example.reader.SimpleReader;
Run Code Online (Sandbox Code Playgroud)

我得到了什么 'Undefined variable "com" or class "com.example.reader.SimpleReader"'

Jas*_*n S 7

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

javaclasspath('/path/to/myjar.jar')
myobj = com.example.mypackage.MyObject;
myobj.someMethod(123);
Run Code Online (Sandbox Code Playgroud)

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


我得到了

javaclasspath('c:/reader/reader.jar'); 
obj = com.example.reader.SimpleReader; 
Run Code Online (Sandbox Code Playgroud)

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

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


嗯...

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

    javap -classpath c:/reader/example.jar com.example.reader.SimpleReader
    
    Run Code Online (Sandbox Code Playgroud)

你说你使用的是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 <javac>任务)这通常不是一个大问题,因为1.6是从1.5开始的一种渐进式改进 - 尽管如果你使用的是少数Java 6类ArrayDeque,或者外部库那么依靠1.6,你运气不好.

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

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

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