Java and Mathematica interaction



如何在 Mathematica 中使用 Java?

我有两个文件,GRASP.nbGRASP.java,在同一个文件夹中(顺便说一句:GRASP=贪婪的随机自适应搜索过程)。GRASP.java文件包含一个方法 public static int[] TSP(int[][] g, int numberOfIterations, int k) 。我想在 Mathematica 中调用此方法。

我在Mathematica文档中读到,也在这里,我应该写

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

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

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

任何工作示例将不胜感激。

不要忘记先编译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的要求。

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

javac GRASP.java

但它可能会更难,具体取决于该文件中的内容。同样,类的名称可能不仅仅是GRASP - 如果文件中有一个package com.foo.something语句,那么参数将被com.foo.something.GRASP

最新更新