0

我从创建 JavaVM() 的 C/C++ 应用程序调用 Java Swing 面板。一切正常。出于任何原因,如果 C/C++ 崩溃,那么我会看到消息致命错误已被 Java 运行时环境检测到。崩溃发生在 JVM 之外的本机代码中。

我可以在 JVM 中设置任何选项来忽略本机代码中的错误吗?以下是留言。

Java 运行时环境检测到一个致命错误:

SIGSEGV (0xb) 在 pc=0xfd933144,pid=29358,tid=1

JRE 版本:6.0_22-b04 Java VM:Java HotSpot(TM) 客户端 VM(17.1-b03 混合模式 solaris-sparc) 有问题的框架:C [libc.so.1+0x33144] strlen+0x80

如果您想提交错误报告,请访问:http: //java.sun.com/webapps/bugreport/crash.jsp 崩溃发生在 Java 虚拟机之外的本地代码中。请参阅有问题的框架以了解报告错误的位置。

4

2 回答 2

1

不,绝对不。

如果您收到致命错误,那是因为 JRE 检测到一种情况,它认为 JRE 数据结构已发生严重损坏;例如,堆已损坏。

没有办法让 JRE 继续处于可能损坏的状态。无论如何尝试都是个坏主意。


您需要找到并修复导致这些崩溃的 C/C++ 代码中的问题。如果这太难了,那么:

  • 用 Java 重新编码本机代码并放弃 C/C++ 版本,或者
  • 将 C / C++ 代码转换为独立的应用程序,并使用System.exec()... 或其他方式运行它。

(或者,由于您在 C/C++ 应用程序中运行 JVM,请让后者启动一个单独的 JVM。)

于 2013-02-19T23:03:52.197 回答
0

正如@Stephen C 指出的那样,您应该尝试修复崩溃,而不是忽略它们并以另一种方式看待。

但是,如果崩溃超出了您的范围(例如,有缺陷的库),您可以重写您的应用程序以从 Java 开始。Java 程序只会通过 JNI 调用 C++ 应用程序,将 C++ 调用包含在 try/catch 块中的本机代码中。如果您期望出现异常(例如,内存访问冲突),只需捕获它并且什么都不做。

代码示例可以在这个 SO 答案中看到:https ://stackoverflow.com/a/918891/1043352

于 2013-02-21T07:32:48.513 回答