首页 > 解决方案 > 在 Octave 中导入 Java 类

问题描述

我一直很难弄清楚如何做到这一点。从Octave website看来,java类是通过类路径找到的。 这个 Stack Overflow 答案表明“静态 java 路径”是“动态 java 路径”。但是我不确定如何设置静态 java 路径。

在我感兴趣的特殊情况下,我正在尝试将 javaplex 包与 Octave 一起使用——我已经联系了 Github 上 javaplex 的作者,他们说如果 Octave 可以加载 java 类,那么我可以使用它。据我所知,八度可以做到这一点。我的困难如下。

我正在使用为 Matlab 编写的代码,而 Octave 和 Matlab 与 Java 交互方式的差异给我带来了一些麻烦。我必须为 Octave 设置目录

C:\...\javaplex-master\javaplex-master\dist\matlab-examples-4.3.4\matlab_examples

从这里,我在load_javaplex运行脚本“”的命令窗口中运行命令“ load_javaplex.m”。然而,在这个脚本中是行

javaaddpath('./lib/javaplex.jar');

import edu.stanford.math.plex4.*;

其中“ edu.stanford.math.plex4.*”是一个 java 类(本教程还建议显式运行第二行)。

我发现这在 Octave 中不起作用(至于 Java 接口,我不能只使用 Matlab 代码),所以我需要将它添加到我的 java 类路径中才能访问它。但是我不知道如何在 Octave 中做到这一点。我应该在标识静态类路径的目录中保存某种 .txt 文件吗?关于如何在 Octave 中加载 java 类的任何一般信息?我很难通过在线提供的信息来弄清楚如何做到这一点。在类路径中添加一些内容后我该怎么办?

标签: javamatlaboctave

解决方案


好消息是,将 java 指令从 matlab 语法转换为 octave 语法非常容易。

坏消息是,您必须将 matlab 语法转换为 octave 语法。虽然这很简单,但这确实意味着您可能还必须在提供的 m 文件中搜索任何 java 调用(而不仅仅是在您自己的代码中)并调整语法。(显然,您可能会想出一个很好的方法来自动化该过程。)

以下是我如何让教程在 octave 上工作:

  • 我下载了matlab_exampleszipfile 并按照说明解压缩(我在桌面上解压缩了文件夹,即在我的机器上,这导致了文件夹/home/tasos/Desktop/matlab_examples
  • 我打开八度并cd进入该目录
  • 打开load_javaplex.m文件并删除所有import语句,然后运行它以“初始化”javaplex。
  • 您现在已准备好api.Plex4.createExplicitSimplexStream()按照教程中的指示运行命令,但是,首先您需要注意两件事:

    1. Octave 不提供从包中导入 java 类的方法,因此您的所有类调用都需要完全由包限定。即包的Plex4api实际上需要完全限定为edu.stanford.math.plex4.api.Plex4. 您可以通过打开 .jar 文件并探索其文件夹结构来确认它是包Plex4的一个类api,它本身就是包的(子)包。edu.stanford.math.plex4

    2. 创建 java 对象、调用 java 方法等的语法在 octave 中与在 matlab 中不同。有关详细信息,请参阅octave 手册中的相关页面

因此api.Plex4.createExplicitSimplexStream(),旨在调用(不带参数)包中类的createExplicitSimplexStream方法的,将以八度音程调用,如下所示:Plex4edu.stanford.math.plex4.api

javaMethod( 'createExplicitSimplexStream', 'edu.stanford.math.plex4.api.Plex4')

然后输出为教程中描述的答案。

说了这么多,请注意,虽然您不能import直接使用类或(子)包来使您不必一直重写长包字符串,但 octave 的 java 接口似乎确实非常依赖字符串,这意味着它相当容易将如此长的字符串存储为变量并在必须访问类时重用它们。因此,例如,您可以将字符串保存'edu.stanford.math.plex4.'到一个名为的变量中plex4,然后简单地javaMethod('createExplicitSimplexStream', [plex4, 'api.Plex4'])在您的代码中调用,等等,这使得它稍微不那么麻烦。

玩得开心。


推荐阅读