Ошибка: Неопределенная функция или переменная — java в MATLAB

#java #matlab #javafx

#java #matlab #javafx

Вопрос:

Я хотел бы запустить простой медиаплеер, созданный на Java из MATLAB, точнее, этот:https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/mediaplayerjava.htm

Этот код компилируется без каких-либо проблем и работает как при попытке запустить его в IntelliJ, так и при компиляции с javac и запуске файла .class.

Он успешно компилируется под той же версией Java, что и моя MATLAB, поэтому я сообщаю, где находятся java-файлы javaaddpath(pwd) . По какой-то причине я получаю сообщение об ошибке «Неопределенная функция или переменная ‘MediaPlayer’ при запуске кода, приведенного в ссылке выше, делая это следующим образом: test = MediaPlayer или test = MediaPlayer(); Чтобы убедиться, что все работает, я попытался скомпилировать, а затем запустить простой Java Hello World в MATLAB, который работал нормально.

В чем может быть проблема? Если у вас есть время, пожалуйста, помогите мне, скомпилировав код по ссылке выше (2 файла, нажмите «Следующая страница для второго файла Java) и попробуйте запустить его в MATLAB. Я был бы чрезвычайно благодарен за любую помощь!

Ответ №1:

Короткий ответ:

MediaPlayer Определено в пакете mediaplayer в вашем Java (FX) коде:

 package mediaplayer;
  

Следовательно, правильная инициализация будет:

 test = mediaplayer.MediaPlayer();
  

Длинный ответ:

С этого момента этот вопрос становится действительно специфичным для JavaFX, а не о тривиальной совместимости Matlab — Java.

Проблемы:

  • JavaFX по умолчанию включен в Java8, и даже Matlab R2016 поставляется с Java7, поэтому пакет JavaFX ( javafx.* ) не будет находиться в пути к классам JVM Matlab, поэтому вы должны убедиться, что JavaFX находится в пути к классам JVM.
  • Как только вам удастся запустить Application (например test = mediaplayer.MediaPlayer(); test.main({''}); ), он заблокирует поток Matlab. Что еще хуже, когда вы закрываете окно, Application все равно не завершится, и поток Matlab остается заблокированным. Это можно обойти, вызвав setImplicitExit(true) в start методе Application . Это заставит Application завершиться, когда все Stage будут закрыты, поэтому поток Matlab больше не блокируется.
  • На данный момент проблема заключается в том, что Application не может быть запущен более одного раза. Итак, если вы завершили работу, вы никогда не сможете снова запустить то же самое Application .

Что вы можете сделать для обработки последних двух пунктов, так это реализовать «Application starter» на Java, который выполняется в отдельном потоке и может использоваться для выполнения приложений JavaFX.

Комментарии:

1. Я фактически удалил пакет из кода, поэтому я компилирую его, как описано. В любом случае, проблема все еще существует. Вы правы в том, что Matlab R2016 поставляется с Java7, поэтому я компилирую код следующим образом (OS X): javac -source 1.7 -target 1.7 MediaPlayer.java и это работает, я могу нажать на файл класса, и медиаплеер запустится. Я попытаюсь добавить пакет JavaFX в мою JVM MATLAB. Что касается проблем, о которых вы упоминаете, эта информация была очень ценной для меня, большое спасибо! PS. Есть ли какой-нибудь хороший источник для такого рода информации, касающейся MATLAB и Java?

2. В прошлом мне приходилось подключать серверную часть Matlab к интерфейсу JavaFX, и в те дни не было ничего действительно достойного материала по этой теме. Содержание этого ответа на самом деле представляет собой проблемы, с которыми я столкнулся при выполнении задачи, и решения были получены в основном в результате экспериментов и чтения документации JavaFX (особенно javadoc Application класса может быть действительно ценным, чтобы понять, почему что-то происходит 🙂 ).