【问题标题】:Matlab crashes on library initialize when called from Java当从 Java 调用时,Matlab 在库初始化时崩溃
【发布时间】:2012-11-07 03:18:52
【问题描述】:

我的设置是我使用 Java 应用程序通过 JNI 调用本机 C 代码,这反过来启动 MATLAB 运行时并在其上调用函数(我知道还有其他解决方案可以从 Java 调用 MATLAB 方法)。

问题是 MATLAB 引擎在初始化期间的某个时间点崩溃,我不知道究竟是什么原因造成的。崩溃导致我的 jvm 终止,我认为这是某种内存损坏。

实际崩溃的调用MATLAB函数的C++代码是

JNIEXPORT void JNICALL 
some_jni_vodoo_initializeLibrary(JNIEnv* env, jclass thisClass) {
  try {
      if (!mclInitializeApplication(NULL, 0)) {
          THROW_EXCEPTION(env, "Could not initialize the application properly.");
          return;
      }
      if (!<library>Initialize()) {
          THROW_EXCEPTION(env, "Could not initialize the library.");
          return;
      }
    } ...

函数&lt;library&gt;Initialize()在这里崩溃,Java错误日志读取

Stack Trace:
  [0] jmi.dll:0x793f4175(0x7934cdca, 1, 0x7937e67c "à;.y`E.y@E.ychar in C:\BUILD_ARE..", 0x792d6a32)
  [1] jvm.dll:0x792df9a5(0xc0000005, 0x79356791, 0x4961b400 "Ð\8y", 0x6d8b29de)
  [2] jvm.dll:0x792e0431(0x8b515008, 0x70f0e8ce, 0x8b5ffffa, 0xc25d5ec6)

------------------------------------------------------------------------
        Fatal Java Exception detected at Fri Apr 30 11:08:08 2010
------------------------------------------------------------------------

Configuration:
  MATLAB Version:   7.8.0.347 (R2009a)
  MATLAB License:   unknown
  Operating System: Microsoft Windows Vista
  Window System:    Version 6.0 (Build 6002: Service Pack 2)
  Processor ID:     x86 Family 6 Model 10 Stepping 5, GenuineIntel
  Virtual Machine:  Java is not enabled
  Default Encoding:  windows-1252

Java is not enabled

我真的不知道可能出了什么问题。 jvm没有足够的内存吗?我猜这个问题在某种程度上与 Java 有关,因为从一个简单的测试 C++ 程序调用 JNI 函数可以正常工作......

谢谢

【问题讨论】:

    标签: matlab java-native-interface


    【解决方案1】:

    初步构想

    我见过的唯一类似的事情是由于许可证无效而从 MATLAB 无声退出。

    另一种可能性是嵌套的 Java 环境。由于 MATLAB 需要自己的 Java 环境,所以这里可能存在一些问题。 编辑:见下文!

    您正在运行 MATLAB 引擎吗?或者您是否使用一些“系统”或“执行”调用来调用单独的 MATLAB 命令?这可能会提供一个很好的线索。


    回答

    答案出现在下面的 cmets 中。为了便于阅读,将其复制在这里:

    在拥有自己的 JVM 的进程中嵌套调用 MATLAB 引擎时,您必须通过将 -nojvm 传递给 mclInitializeApplication 来告诉 MATLAB 在没有 JVM 的情况下运行,或者通过设置全局 @ 来告诉它使用哪个 JVM 987654323@ 到您希望使用的 JVM 的位置,例如 C:\Program Files\Java\jre6。

    第一个选项将禁用 MATLAB 中需要 JVM 的任何功能,因此第二个选项更可取。

    【讨论】:

    • 现在问题解决了,问题确实与嵌套的jvm有关。解决方案是将-nojvm 传递给mclInitializeApplication,然后MATLAB 不再使用任何jvm。我认为问题在于 MATLAB 试图附加到我现有的 jvm 版本错误(1.6 而不是 1.5)。
    • 是的,好电话。我从来没有像这样使用过 MATLAB,但是当我以其他方式嵌套它时,我也会使用 -nojvm。
    • 有些功能需要 JVM。我想知道是否有办法保留这一点,并且仍然避免崩溃。
    • 是的,有。你可以设置一个全局变量MATLAB_JAVA,它指向你安装的jre。当将此变量指向 1.6 jre 时,不需要 -nojvm 并且 MATLAB 成功附加到我的 1.6 jvm。
    • 答案!伟大的。 (对了,这个全局是路径?)
    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2011-12-08
    • 2016-04-08
    相关资源
    最近更新 更多