错误:未定义的函数或变量 - MATLAB 中的 java

Posted

技术标签:

【中文标题】错误:未定义的函数或变量 - MATLAB 中的 java【英文标题】:Error: Undefined function or variable - java in MATLAB 【发布时间】:2016-10-18 23:16:06 【问题描述】:

我想从 MATLAB 运行一个用 Java 制作的简单媒体播放器,更准确地说是这个:https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/mediaplayerjava.htm

无论是在 IntelliJ 中尝试运行它,还是使用 javac 编译并运行 .class 文件时,此代码都可以毫无问题地编译并正常工作。

它在与我的 MATLAB 使用的相同 Java 版本下成功编译,所以我用javaaddpath(pwd) 告诉 java 文件在哪里。出于某种原因,我在运行上面链接中提供的代码时收到错误“未定义的函数或变量'MediaPlayer',这样做:test = MediaPlayertest = MediaPlayer(); 为了确保一切正常,我尝试编译然后运行MATLAB 中的一个简单的 java Hello World,运行良好。

可能是什么问题?如果您有时间,请帮助我编译上面链接中的代码(2 个文件,按“下一页获取第二个 java 文件)并尝试在 MATLAB 中运行它。非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

简答:

MediaPlayer 在 Java(FX) 代码中的包 mediaplayer 中定义:

package mediaplayer;

因此,正确的初始化应该是:

test = mediaplayer.MediaPlayer();

长答案:

从这一点开始,这个问题变得真正特定于 JavaFX,而不是关于琐碎的 Matlab - Java 互操作性。

问题:

JavaFX默认是绑定在Java8里面的,甚至Matlab R2016也自带Java7,所以JavaFX包(javafx.*)不会在Matlab的JVM的classpath下,所以一定要保证JavaFX在classpath JVM 的。 一旦您设法启动Application(例如test = mediaplayer.MediaPlayer(); test.main('');),它将阻塞Matlab 线程。更糟糕的是,当你关闭窗口时,Application 仍然不会退出,Matlab 线程仍然被阻塞。这可以通过在Applicationstart 方法中调用setImplicitExit(true) 来解决。当所有Stages 都关闭时,这将强制Application 退出,因此不再阻塞Matlab 线程。 此时的问题是不能多次启动Application。因此,如果您退出了,您将永远无法再次启动相同的Application

对于最后两点,您可以做的是在 Java 中实现一个“应用程序启动器”,它在一个单独的线程上运行并且可用于执行 JavaFX 应用程序。

【讨论】:

我实际上删除了代码中的包,因此我像描述的那样编译它。无论如何,问题仍然存在。您对 Matlab R2016 附带 Java7 是正确的,因此我编译这样的代码(OS X): javac -source 1.7 -target 1.7 MediaPlayer.java 并且它可以工作,我可以按下类文件并且媒体播放器将运行.我将尝试将 JavaFX 包添加到我的 MATLAB JVM。关于你提到的问题,这些信息对我来说很有价值,非常感谢! PS。有关 MATLAB 和 Java 的此类信息有什么好的来源吗? 过去我不得不将 Matlab 后端与 JavaFX 前端连接起来,而那些日子里没有关于这个主题的真正有价值的材料。这个答案的内容实际上是我在完成任务时遇到的问题,解决方案主要来自试验和阅读 JavaFX 的文档(尤其是 Application 类的 javadoc 对于理解为什么会发生这种情况非常有价值: ) ).

以上是关于错误:未定义的函数或变量 - MATLAB 中的 java的主要内容,如果未能解决你的问题,请参考以下文章

matlab函数和变量无法识别怎么办?

MATLAB R2015a 中未定义的函数或变量“fplot3”

MATLAB .NET 程序集(未定义函数或变量“前馈网络”)

未定义函数或变量 'O'。怎么解决

matlab中安装好了cvx好了工具箱 还是报错 未定义函数或变量 'cvx_begin'

函数中的 Matlab RMI 错误包含在启动和运行期间