我在我的应用程序中使用JNI访问DLL。有时,应用程序崩溃,将此消息写入日志文件:
A fatal error has been detected by the Java Runtime Environment.
我试着用Runtime.getRuntime().addShutdownHook(jvmShutdownHook);
来处理这个问题,但是没有成功。
有人能帮我吗?
发布于 2014-03-07 02:27:57
可能有助于在调用dll的块中放置尝试捕获Throwable和打印错误消息。
你在使用像slf4j或log4j这样的记录器吗?您能将您所调用的代码行添加到您的问题和有关哪个dll的信息中吗?如果它的程序-那么将很难帮助,但也许您可以尝试与已知的公共dll类似,以确保它不涉及一般环境或使用JNI的方式,是造成问题的。
样本代码:
try{
logger.log("entering code location XXX"); //replace XXX with 1-3 words more meaningful and unique
///do something with JNI
}catch(Throwable e){
logger.warn("Error at XXX " + e, e);
}
请确保不使用:
-g:none -不生成调试信息
默认情况下,包括所有调试信息,因此如果您之前没有自定义,则不需要更改任何内容。不同的工具有不同的指定方法。取决于编译和构建方法(批处理、ant、maven等)
示例如果使用log4j,将打印类名和错误行号。要记录文件和控制台:
http://jakarta.apache.org/log4j/' debug="false">
有关apache log4j和slf4j站点的更多信息(也可以使用slf4j日志记录或简单的系统打印输出)
发布于 2014-03-07 02:40:41
你自己写DLL了吗?然后,您很可能定义了一个带有错误签名的本机函数,或者您使用了错误的JNI函数。看看Java本机接口文档。在这里添加可疑代码片段以获得进一步的支持。
如果您使用的是第三方库,则无法简单地捕获错误,因为导致VM崩溃的本机错误在大多数情况下对于JVM来说是无法解决的。
https://stackoverflow.com/questions/22246832
复制