1

编辑 2在收到 Mathworks 支持的回复后,我自己回答了这个问题。简而言之,有一个选项类MWComponentOptions在实例化时传递给导出的类。除其他外,这可以为错误输出和常规输出(即来自disp()-liked 函数)指定唯一的打印流。感谢所有的回复:)

==================================================== ===================

只是一个简单的问题 - 有什么方法可以防止 MATLAB 代码在disp编译后使用(和类似的)函数输出到 Java 控制台?MATLAB 中有用的调试信息很快就变成了 Java 日志中令人讨厌的额外文本。

我使用的编译工具是 MATLAB Compiler(我认为它与 MATLAB Builder JA 不同,但我可能错了)。我在该命令上找不到任何好的文档,mcc所以不确定是否有任何选项。

当然,如果这是不可能的,并且是编译器将所有 MATLAB 代码转换为其 Java 等效代码的直接后果,那么这是完全可以理解的。

提前致谢

编辑这对于仅在 Java 端处理错误报告也很有用——目前所有 MATLAB 错误都被发送到控制台,无论它们是否被捕获。

4

3 回答 3

2

我收到了对 Mathworks 支持的请求,他们提供了以下解决方案:

在创建任何已导出的类时,您可以指定一个MWComponentOptions对象。这在 R2012b 中没有得到很好的记录,但是对于我想要的,下面的例子可以工作:

MWComponentOptions options = new MWComponentOptions();
PrintStream o = new PrintStream(new File("MATLAB log.log"));

options.setPrintStream(o); // send all standard dips() output to a log file
// the following ignores all error output (this will be caught by Java exception handling anyway)
options.setErrorStream((java.io.PrintStream)null);

// instantiate and use the exported class
myClass obj = new myClass(options);
obj.myMatlabFunction();
// etc...

更新

如果有人确实想抑制所有输出,则套管最终会导致null部署中。抑制所有输出的更好方法是使用创建一个虚拟打印流,例如:java.io.PrintStreamNullPointerException

PrintStream dummy = new PrintStream(new OutputStream() {
    public void close() {}
    public void flush() {}
    public void write(byte[] b) {}
    public void write(byte[] b, int off, int len) {}
    public void write(int b) {}
} );

然后使用

options.setErrorStream(dummy);

希望这可以帮助 :)

于 2012-12-13T10:17:57.757 回答
2

如果在已部署的应用程序(例如 MATLAB Compiler 或 Builder JA)中运行,该isdeployed函数返回 true,在实时 MATLAB 中运行时返回 false。

disp您可以用块包围您的语句if isdeployed

于 2012-12-12T12:02:15.047 回答
1

如果您有一个独立的应用程序并且根本不想打扰类,那么另一个可能的黑客攻击:

在编译期间使用 evalc 并部署您的函数名称:

function my_wrap()
    evalc('my_orig_func(''input_var'')');
end

并像这样编译

mcc -m my_wrap my_orig_func <...>

好吧,这显然是另一个黑客。

于 2013-03-05T15:33:40.543 回答