在多线程Java应用程序中调用已编译的m文件(.jar)时出错

时间:2010-01-04 04:59:39

标签: java matlab

我有一个简单的m文件

function [fRate,Height,Width] = media(filename)  
obj = mmreader(filename);  
fRate = obj.FrameRate;  
Width = obj.Width;  
Height = obj.Height;  
end

我使用MATLAB Builder JA成功编译成.jar文件。

我已在单线程应用程序中测试了.jar文件,它没有问题。

当我在多线程GUI应用程序中使用它时出现错误。我将.jar作为我创建的类中的一个线程运行,并发生以下错误。

  

检测到意外错误   by Java Runtime Environment:

     

EXCEPTION_ACCESS_VIOLATION   (0xc0000005)在pc = 0x6d9c08b0,   pid = 5920,tid = 4788

     

Java VM:Java HotSpot(TM)客户端VM   (10.0-b19混合模式windows-x86)   有问题的框架:

     

C [jvm.dll + 0x1108b0]

调试后,我发现当我的线程正在调用时发生错误 media = new Media();(我将我的.jar命名为Media.jar)

这是我的Java代码:
// mediaProperty.java

public class mediaProperty implements Runnable {

public void mediaProperty() {

    Matlab_options matlab = new Matlab_options();
    Object[] mediaProp = null;
    java.util.List lstMedia = new ArrayList();
    Media media = null;

    try {

        media = new Media();
        ...

        mediaProp = media.media(3, lstMedia);

        ...
    } catch (Exception p) {
        System.out.println("Exception: " + p.toString());
    } finally {
        MWArray.disposeArray(mediaProp);
        if (media != null) {
            media.dispose();
        }
    }
}

public void run() {
    mediaProperty();
}

public void mediaProperty() { Matlab_options matlab = new Matlab_options(); Object[] mediaProp = null; java.util.List lstMedia = new ArrayList(); Media media = null; try { media = new Media(); ... mediaProp = media.media(3, lstMedia); ... } catch (Exception p) { System.out.println("Exception: " + p.toString()); } finally { MWArray.disposeArray(mediaProp); if (media != null) { media.dispose(); } } } public void run() { mediaProperty(); }

}

// GUI.java

private Thread mediap;

有什么问题?这是我的代码吗?

1 个答案:

答案 0 :(得分:3)

我的猜测是MATLAB要求您从一个线程中访问它。你说它适用于单线程应用程序,也许你需要启动一个专用的线程来与MATLAB交互以使其正常工作。

另见
Thread safety of Matlab engine API