2011-05-09 73 views
4

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

我的数学文档阅读,也here,我应该写

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

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

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

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

回答

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"]; 
[email protected][{{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"]; 
[email protected][{{1,2,3},{4,5,6}}, 7, 8] 

如果该类是在一个名为包com.stackoverflow在我的例子),然后确保班级具有相对于笔记本的路径com/stackoverflow/GRASP.class。这是Java的要求,而不是Mathematica。

+0

它就像一个魅力!谢谢,非常感谢。 – Leon 2011-05-09 13:01:27

1

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

javac GRASP.java 

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