【问题标题】:Calling Java from MATLAB从 MATLAB 调用 Java
【发布时间】:2011-10-22 10:29:20
【问题描述】:

我一直在使用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> > 写入文本文件的函数和一个读取它的函数。

生成的swig文件有:com.example.reader包中的SimpleReader.javaDoubleVector.javaexampleJNI.javaexample.javaDoubleVector2.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"'

【问题讨论】:

  • 请给出一个更详细的例子,说明您正在执行哪些 MATLAB 语句。

标签: java class matlab wrapper swig


【解决方案1】:

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

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; 

此时我得到'未定义的变量“com”或类“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 版本——这很可能是问题所在。 Earlier versions of MATLAB use an older version of the Java JRE:

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

用于 MATLAB 6.5.1 (R13SP1) 的 JVM 1.3.1

用于 MATLAB 7.0.1 (R14SP1) 的 JVM 1.4.2

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

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

  • (如果可能)- 仅使用与 Java 5 兼容的 JAR 文件。在这种情况下,由于您正在制作自己的库,因此您需要使用 the -target 1.5 option。 (target="1.5" 如果您使用的是 ant <javac> 任务)这通常不是什么大问题,因为 1.6 是对 1.5 的一种增量改进——尽管如果您使用的是少数 Java 6 类中的一些类比如ArrayDeque,或者依赖于1.6的外部库,你就不走运了。

  • changing the JVM 将 JRE 1.6 与 Matlab 7.4 一起使用。不确定这是个好主意。

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

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

【讨论】:

  • 道歉我的意思是 javaclasspath('c:/reader/example.jar');我也确实使用 jar -tf 确保所有内容都在其中,然后以防万一用 7zip 打开 jar 文件。
  • 我使用的是 Matlab 7.0.4。这些类是公共的,并且具有不带参数的公共构造函数。该命令导致: 从“SimpleReader.java”编译 public class com.example.reader.SimpleReader extends java.lang.Object{ // 方法列表 // 看起来正确 }
  • 啊哈,很可能是JVM版本不兼容。查看我的最新编辑。
  • 太棒了——很高兴我能帮上忙!几年前我遇到了这个问题,这真是个麻烦事。
  • 对我来说也是版本不兼容; Matlab 使用 Java 1.6,但 jar 是用 1.7 构建的。为了解决这个问题,我按照答案中提供的“更改 JVM”链接。
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多