Java和Mathematica交互

时间:2011-05-09 00:37:54

标签: java wolfram-mathematica

如何在Mathematica中使用Java?

我在同一个文件夹中有两个文件GRASP.nbGRASP.java(BTW:GRASP =贪婪的随机自适应搜索程序)。 GRASP.java文件包含方法public static int[] TSP(int[][] g, int numberOfIterations, int k)。我想在Mathematica中称这种方法。

我在Mathematica文档和here中读到了我应该写的

Needs["JLink`"]; 
InstallJava[]; 
obj=JavaNew[NotebookDirectory[]~~"GRASP.java"]

Needs["JLink`"]; 
InstallJava[]; 
obj=LoadJavaClass[NotebookDirectory[]~~"GRASP.java"]

或类似的东西,但我尝试的任何东西都会返回错误。我有WinXP,Mathematica 7,Eclipse 3.6。

非常感谢任何工作实例。

2 个答案:

答案 0 :(得分:7)

不要忘记先编译Java类 - 不能直接加载GRASP.java

编译完成后,请尝试以下操作:

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
LoadJavaClass["GRASP"];
GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8]

由于TSP方法是静态方法,因此必须先加载Java类,然后才能访问它。请注意,该类成为名为GRASP的Mathematica上下文,静态方法在该上下文中作为符号进行访问(GRASP`TSP,如上所示)。

如果您要访问的方法是常规方法(非静态方法),则调用序列将显示为:

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
obj = JavaNew["GRASP"];
obj@someMethod[{{1,2,3},{4,5,6}}, 7, 8]

所有这些都假定您的Java类包含在默认包中 - 这是一种不寻常的情况。如果类包含在命名包中,则语法如下:

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
LoadJavaClass["com.stackoverflow.GRASP"];
com`stackoverflow`GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8]

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
obj = JavaNew["com.stackoverflow.GRASP"];
obj@someMethod[{{1,2,3},{4,5,6}}, 7, 8]

如果 类在命名包中(我的示例中为com.stackoverflow),请确保该类具有相对于笔记本的路径com/stackoverflow/GRASP.class。这是Java的要求,而不是Mathematica。

答案 1 :(得分:1)

您链接到的StackOverflow帖子显示了Java类的名称(GRASP),而不是源文件的名称,作为参数传递,因此绝对会丢失.java。此外,您需要编译源文件以生成GRASP.class文件,因为这是可以实际加载的格式。这可能就像

一样简单
javac GRASP.java

但可能更难,取决于该文件中的内容。同样,类的名称可能不仅仅是GRASP - 如果文件中有package com.foo.something语句,则参数将为com.foo.something.GRASP