Matlab + Java:尝试使用 javabuilder 时出现 java.lang.ExceptionInInitializerError

发布于 2024-09-19 18:18:59 字数 2362 浏览 8 评论 0原文

我一直在尝试在 Windows XP 下使用 Matlab 的 javabuilder 包,但在尝试实例化任何 javabuilder 类时遇到奇怪的错误。为了说明问题,我创建了一个简单的程序,它打印 MCRROOT 和 PATH 系统变量(以检查它们是否正确设置)并尝试创建 MWCharArray:

import com.mathworks.toolbox.javabuilder.*;
import com.mathworks.toolbox.javabuilder.internal.MCRConfiguration;

class Main
{
   public static void main(String[] args)
   {
       System.out.println("MCRROOT: " + System.getenv("MCRROOT"));
       System.out.println("PATH: " + System.getenv("PATH"));
       System.out.println(MCRConfiguration.isInstalledMCR());
       MWCharArray test = new MWCharArray("Test");
   }
}

当我执行该程序时,输出为:

MCRROOT: C:\Program files\MATLAB\MATLAB Compiler Runtime\v710
PATH: C:\Program files\CollabNet Subversion Client;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program files\MATLAB\MATLAB Compiler Runtime\v710
false
Exception in thread "main" java.lang.ExceptionInInitializerError
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:77)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.<clinit>(MCRConfiguration.java:51)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:56)
        at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1447)
        at com.mathworks.toolbox.javabuilder.MWUtil.GetUnknownClassID(MWUtil.java:1258)
        at com.mathworks.toolbox.javabuilder.MWClassID.<clinit>(MWClassID.java:41)
        at com.mathworks.toolbox.javabuilder.MWCharArray.<init>(MWCharArray.java:75)
        at Main.main(Main.java:11)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at java.lang.String.substring(String.java:1937)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.get(MCRConfiguration.java:70)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.<clinit>(MCRConfiguration.java:72)
        ... 8 more
Java Result: 1

首先,MCRROOT 和 PATH 的值是否正确?我尝试通过谷歌查找如何设置 MCRROOT,但结果相互矛盾:一些消息来源说我应该包含 de version dir,其他消息来源则相反。另外,为什么 isInstalledMCR 方法返回 false?我已经仔细检查了 MCR 安装(甚至卸载并安装了它以确保),那么为什么库找不到它呢?

预先感谢您的帮助!

编辑:我也尝试过设置没有版本字符串的 MCRROOT ,但它也失败了。

I've been trying to use Matlab's javabuilder package under Windows XP, but I'm getting a strange error when trying to instantiate any javabuilder class. To illustrate the problem, I've created a simple program that prints the MCRROOT and PATH system variables (to check if they're correctly set) and tries to create a MWCharArray:

import com.mathworks.toolbox.javabuilder.*;
import com.mathworks.toolbox.javabuilder.internal.MCRConfiguration;

class Main
{
   public static void main(String[] args)
   {
       System.out.println("MCRROOT: " + System.getenv("MCRROOT"));
       System.out.println("PATH: " + System.getenv("PATH"));
       System.out.println(MCRConfiguration.isInstalledMCR());
       MWCharArray test = new MWCharArray("Test");
   }
}

When I execute the program, the output is:

MCRROOT: C:\Program files\MATLAB\MATLAB Compiler Runtime\v710
PATH: C:\Program files\CollabNet Subversion Client;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program files\MATLAB\MATLAB Compiler Runtime\v710
false
Exception in thread "main" java.lang.ExceptionInInitializerError
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:77)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.<clinit>(MCRConfiguration.java:51)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:56)
        at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1447)
        at com.mathworks.toolbox.javabuilder.MWUtil.GetUnknownClassID(MWUtil.java:1258)
        at com.mathworks.toolbox.javabuilder.MWClassID.<clinit>(MWClassID.java:41)
        at com.mathworks.toolbox.javabuilder.MWCharArray.<init>(MWCharArray.java:75)
        at Main.main(Main.java:11)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at java.lang.String.substring(String.java:1937)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.get(MCRConfiguration.java:70)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.<clinit>(MCRConfiguration.java:72)
        ... 8 more
Java Result: 1

First of all, are MCRROOT's and PATH's values correct? I've tried google for finding out how to set MCRROOT, but there are conflicting results: some sources say that I should include de version dir, others say the opposite. Also, why is the isInstalledMCR method returning false? I've double-checked the MCR installation (and even uninstalled and installed it to be sure), so why isn't the library finding it?

Thanks on advance for any help!

Edit: I've also tried setting MCRROOT with no version string, and it also fails.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

多彩岁月 2024-09-26 18:18:59

只是胡乱猜测而已! Java 正在处理字符串,而您的“mcrroot”包含空格。我可能会将 mcr 安装路径更改为 C:\MATLAB\MATLABCompilerRuntime\v710 之类的路径,省略任何空格和特殊字符。

Just wild guessing! Java is messing around with strings, while your 'mcrroot' contains white spaces. I might change the mcr install path to something like C:\MATLAB\MATLABCompilerRuntime\v710, omitting any white spaces and special characters.

最笨的告白 2024-09-26 18:18:59

我找到了解决方案,所以我发布了一个自我回答以供将来参考:除了将 javabuilder.jar 添加到程序的类路径之外,您还必须将 MCR 运行时库的路径添加到 java.library .path JDK参数。

我的错误是,我没有将路径设置为 MCR 安装目录中库的路径(在我的情况下,C:\MATLAB\MCR\v710\runtime\win32),而是复制了运行时目录复制到我的项目目录并使用它。看来javabuilder库使用了java.library.path变量,猜测是MCROOT,什么可以解释奇怪的“StringIndexOutOfBoundsException”。

I've found the solution, so I'm post a self answer for future reference: Besides adding the javabuilder.jar to the program's classpath, you also have to add the path to the MCR's runtime libraries to the java.library.path JDK parameter.

My mistake was that, instead of setting the path as the path to the libraries at the MCR installation directory (On my case, C:\MATLAB\MCR\v710\runtime\win32), I copied the runtime directory to my project's dir and used it instead. It seems that the javabuilder library uses the java.library.path variable the guess the MCROOT, what would explain the weird "StringIndexOutOfBoundsException".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文