Java и Mathematica взаимодействие - PullRequest
4 голосов
/ 09 мая 2011

Как я могу использовать Java в Mathematica?

У меня есть два файла, GRASP.nb и GRASP.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.

Любой рабочий пример будет высоко оценен.

Ответы [ 2 ]

7 голосов
/ 09 мая 2011

Не забудьте сначала скомпилировать класс Java - вы не можете загрузить GRASP.java напрямую.

После компиляции попробуйте следующее:

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

Поскольку метод TSP является статическим, вы должны загрузить сам класс Java, прежде чем сможете получить к нему доступ. Обратите внимание, что класс становится контекстом Mathematica с именем GRASP и что статический метод доступен как символ в этом контексте (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 голос
/ 09 мая 2011

Пост StackOverflow, на который вы ссылаетесь, показывает имя класса Java (GRASP), а не имя исходного файла, передаваемого в качестве аргумента, поэтому определенно потеряет .java. Кроме того, вам нужно скомпилировать исходный файл, чтобы получить файл GRASP.class, поскольку этот формат действительно может быть загружен. Это может быть так просто, как просто

javac GRASP.java

но это может быть сложнее, в зависимости от того, что в этом файле. Аналогично, имя класса может быть не просто GRASP - если в файле есть оператор package com.foo.something, то аргумент будет com.foo.something.GRASP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...