【问题标题】:Using Java class in Matlab在 Matlab 中使用 Java 类
【发布时间】:2024-04-25 10:25:01
【问题描述】:

我已经为这个问题苦苦挣扎两天了,我发现没有资源能够解决它。

我正在尝试从 Matlab(版本 7.13.0.564 (R2011b))调用一个 java 类(在底部添加了链接)。我已经使用 java 1.6 将 java 类编译成一个 .class 文件,还使用 ​​javaaddpath 添加了文件所在文件夹的路径(我当然检查了动态路径列表中的路径是否正确)。但是,当我尝试使用 javaMethod('main','PerlinNoiseGenerator','') 从 Matlab 调用该类时,出现错误:

“没有类 PerlinNoiseGenerator 可以位于 Java 类路径”

如果有从 Matlab 调用 java 经验的人能总结一下如何做到这一点,我将不胜感激。我可能会分发我的代码,所以我需要动态设置 java 路径,从我读过的内容来看,它确实应该是可能的,尽管我已经看到帖子表明这可能是问题的原因。

http://svn.j3d.org/code/tags/Xj3D-M10/src/java/org/j3d/texture/procedural/PerlinNoiseGenerator.java

【问题讨论】:

标签: java matlab class path


【解决方案1】:

通常我会创建包含 java 类的 jar 文件。我之前也有加载单个 java 类的问题。在您的情况下,我在 xubuntu 13.04 x64 和 Matlab 2013a x64 上执行了以下操作来加载您的特定类:

  1. 使用带有选项-d . 的java 6(不是默认7)编译它以创建一组包文件夹,因为您的类定义了一个包org/j3d/texture/proecedural/ 等:

    /usr/lib/jvm/java-6-openjdk-amd64/bin/javac -d . PerlinNoiseGenerator.java 这将编译类并在当前目录(因此为.)中生成一组包文件夹。

  2. 使用 java 6 中的 jar 再次制作包含您的类的 jar 文件。我将其命名为 javaNoise.jar

    /usr/lib/jvm/java-6-openjdk-amd64/bin/jar cf javaNoise.jar ./org/j3d/texture/procedural/PerlinNoiseGenerator.class

  3. 在Matlab中,javaNoise.jar所在的目录中:

    javaaddpath('./javaNoise.jar');

  4. 创建你的 java 类的对象:

    png=org.j3d.texture.procedural.PerlinNoiseGenerator()

    % results in: png = org.j3d.texture.procedural.PerlinNoiseGenerator@3982a033

  5. 为了测试它,我刚刚生成了一些 1D 噪声:

    png.noise1(1.2)

    ans = -0.0960

希望这会有所帮助。

附: javaMethod('main','PerlinNoiseGenerator','') 不会工作,因为这个类没有主要方法:-)。

【讨论】:

  • @Litterate 很高兴我能帮上忙。如果是这样,接受答案会很有用:-)
  • +1 以获得清晰的说明。据我了解,MATLAB 附带 Oracle Java 6 JRE,这对使用 OpenJDK 进行编译有影响吗?
【解决方案2】:

您对构造函数的编译器的表示法是多态类,意思是“使用在运行时调用的适当构造函数”

公共 PerlinNoiseGenerator()

公共 PerlinNoiseGenerator(int 种子)

可以调用不带参数的第一个表单,但无关紧要,因为带有 this(DEFAULT_SEED) 的行尝试调用自身,但只允许使用一个构造函数

第二个构造函数的参数为​​ int,但需要由已加载的类加载。

使用第一个版本并使用参数更改区分大小写的名称,并从中删除 this(DEFAULT_SEED) 替换为方法名称(您从具有参数的构造函数更改的名称)。 例如公共 perlinNoiseGenerator(int 种子)

注意:按照约定,java 代码方法名称以小写字母开头。

最后一点,来自命令行的 java 参数通过“main”方法以“String”数据类型出现,该方法是应用程序的启动方法(gui 或命令提示符)。 main 方法参数的第一个参数是第一个命令行参数。

public static void main(String[] Args){
new PerlinNoiseGenerator(Args); // recursive class call
}//end main method

int[] args; // global
public PerlinNoiseGenerator(String[] Args){
int arglength=Args.length();
args = new int[arglength];
for(int cnt=0;cnt<arglength;cnt++){
Args[cnt].trim();
args[cnt]=new Integer(Args[cnt]).intValue();
}//enfor
perlinNoiseGenerator(args[0]); // call method
}//end constructor

【讨论】: