Извикайте 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.

РЕДАКТИРАНЕ: Ето версията на 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 файл. Изпълнение на Matlab:

    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. Рестартирайте Matlab.

  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
Classpath не се добавя правилно. Проверете javaclasspath. също опитайте да следвате javaaddpath('директория, където се намира .class файлът'); a = TestFunction(); //Създава обект от класа java. methodview(a); // показва всички методи. a.Add() ; извиква Java метода Add(). След като добавите classpath, проверете classpath.txt на matlab, има ли cp на .class файла. Също така премахнете .java в директорията. запазете само .class в classpath - person Sid; 09.05.2016
comment
Странно е, че няма нещо по-удобно от това. - person Dave C; 18.09.2017