我在我的应用程序中使用JNI访问DLL。有时应用程序崩溃,将此消息写入日志文件:
A fatal error has been detected by the Java Runtime Environment.
我尝试使用Runtime.getRuntime().addShutdownHook(jvmShutdownHook);
处理此问题
但那没用。
任何人都可以帮助我吗?
答案 0 :(得分:0)
可能有助于在调用dll的块中放置try-catch 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等)
示例XML配置如果使用log4j,则会打印类名和行号错误。记录文件和控制台:
http://jakarta.apache.org/log4j/” 调试= “假” >
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> <param name="Threshold" value="ALL" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> </layout> </appender> <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="Threshold" value="ALL" /> <param name="File" value="log/tfwCore.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> </layout> </appender> <logger name="com.tf4" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <logger name="org.apache.http.wire" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <logger name="org.apache.http.headers" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <!-- Context Logging --> <logger name="org.apache.http.impl.client" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <logger name="org.apache.http" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> </log4j:configuration>
有关apache log4j和slf4j站点的更多信息(或者也可以使用Java日志记录或简单的系统输出printlns)
答案 1 :(得分:0)
你自己编写了DLL吗?然后,您最有可能定义了具有错误签名的本机函数,或者您使用的JNI函数错误。请查看Java Native Interface文档。添加可疑的代码段以获得更多支持。
如果您使用的是第三方库,则无法简单地捕获错误,因为导致VM崩溃的本机错误在大多数情况下无法解析为JVM