3

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

我正在尝试从 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

4

2 回答 2

6

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

  1. 使用 java 6(不是默认的 7)编译它,并选择-d .创建一组包文件夹,因为您的类定义了一个包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

希望这可以帮助。

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

于 2013-07-25T12:09:44.903 回答
0

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

公共 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
于 2013-07-25T14:14:26.600 回答