Вызов функции Java из сценария Matlab

Я пытаюсь вызвать функцию Java из сценария Matlab, я пробовал все решения, размещенные на веб-сайте, но у меня не возникло проблемы. Мой класс прост:

  package testMatlabInterface;

public class TestFunction
{
  private double value;

  public TestFunction()
  {
      value=0;
  }

  public double Add(double v)
  {
      value += v;
      return value;
  }

  public static void main(String args[])
  {

  }
}

Итак, я поместил файл .java (также .class) в свою рабочую область C:\scriptsMatlab и добавил этот путь в javaclasspath Matlab, но когда я пытаюсь вызвать функцию, она говорит мне, что в javaclasspath из Matlab нет класса с таким именем.

EDIT: Вот версия Java, которую использует Matlab:

Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode

И это версия jdk, которую я использовал для компиляции своего класса: введите здесь описание изображения

Но когда я пытаюсь выполнить эту команду из Matlab

>> javaaddpath 'C:\scriptsMatlab'
>> obj = TestFunction

он говорит мне:

Undefined function or variable 'TestFunction'.

person Eadhun Di    schedule 02.05.2016    source источник
comment
Вероятно, нужны одинарные кавычки для аргумента. Что произойдет, если вы попробуете import MyFunction.*?   -  person mhopeng    schedule 02.05.2016
comment
он импортирует его, но не может распознать класс   -  person Eadhun Di    schedule 02.05.2016
comment
Я попытался выполнить ответ macduff здесь stackoverflow.com/questions/9520503 /calling-java-from-matlab, но я застреваю в 'methodview testMatlabInterface.TestFunction', он говорит, что "не может быть найден класс testMatlabInterface.TestFunction или нет методов для класса"   -  person Eadhun Di    schedule 02.05.2016
comment
какую версию Java вы использовали для компиляции своего класса? Лучше всего использовать ту же основную версию, что и ваш Matlab, иначе она может не работать.   -  person nirvana-msu    schedule 02.05.2016
comment
Это та же версия, вы можете увидеть мой вопрос после редактирования   -  person Eadhun Di    schedule 03.05.2016


Ответы (1)


Вариант 1

  1. Проверьте, используется ли тот же JRE/JDK для компиляции вашего файла JAVA. Выполнить на Матлабе:

    version -java
    
  2. Скомпилируйте свой MyFunction.java с тот же jdk, что и выше, и найдите свой MyFunction.class

  3. Найдите ваш Matlab classpath.txt. Введите следующее в Matlab cmd.

    which classpath.txt
    
  4. Откройте файл classpath.txt от имени администратора. Добавьте полный путь к каталогу с MyFunction.class в конец файла classpath.txt в виде одной строки и сохраните файл.

  5. Перезапустите Матлаб.

  6. Для запуска в Matlab. Создайте объект MyFunction.

    obj = MyFunction
    

    Чтобы запустить метод main() в Matlab.

    javaMethod('main', obj, '')
    

Вариант 2

Выполните шаги 1-2.

Выполните следующую команду в Matlab

JAVAADDPATH PATH/to/Directoryof MyFunction.class.

Здесь нет необходимости перезапускать Matlab. Просто запустите, используя

obj = MyFunction;
javaMethod('main', obj);

Из MathWorks:

javaMethod(MethodName,JavaObj,x1,...,xN) вызывает метод в классе массива объектов Java® с сигнатурой, соответствующей аргументам x1,...,xN.

javaMethod(StaticMethodName,ClassName,x1,...,xN) вызывает статический метод в классе ClassName.

person Sid    schedule 02.05.2016
comment
Если вы не вызываете obj = MyFunction . Что такое TestFunction? - person Sid; 06.05.2016
comment
Извините, я только что заменил тестовую функцию на другую - person Eadhun Di; 08.05.2016
comment
вы следовали варианту 1? добавить testfunction.class с каталогом пакета в ваш Matlab cp? - person Sid; 08.05.2016
comment
Путь к классам не добавляется должным образом. Проверьте javaclasspath. также попробуйте выполнить javaaddpath('каталог, в котором находится файл .class'); а = ТестФункция(); // Создает объект класса java. представление методов (а); // отображает все методы. а.Добавить(); вызывает метод Java Add(). После того, как вы добавите classpath, проверьте classpath.txt из matlab, есть ли у него cp файла .class. Также удалите .java в каталоге. сохраняйте только .class в пути к классам - person Sid; 09.05.2016
comment
Странно, что нет ничего более удобного, чем это. - person Dave C; 18.09.2017