从Java调用时,Matlab在库初始化时崩溃

时间:2010-04-30 09:33:07

标签: matlab java-native-interface

我的设置是我正在使用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;
      }
    } ...

函数<library>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函数工作正常......

由于

1 个答案:

答案 0 :(得分:3)

初步想法

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

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

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


答案

答案显示在评论的下方。为了便于阅读,将其复制到此处:

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

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