Jna外部库和jvm异常而不是崩溃

时间:2015-10-31 12:10:36

标签: java native jna

我必须使用JNA将我的Java应用程序链接到外部库。 我没有它的来源,然后我无法改变它。 有时会发生这个外部库崩溃我的应用程序的jvm,我不知道可能是什么...也许是外部库的非托管异常,我看到的只是一个应用程序崩溃时调用外部本机方法。 有没有办法避免整个jvm崩溃,只是通过JNA得到一个例外?

要更好地详细说明问题:此库是智能卡驱动程序。在一些s.o.自动更新或在s.o之后待机过程有时我得到了崩溃。没有日志或错误,只是jvm进程的结束。

1 个答案:

答案 0 :(得分:1)

JNA提供了一个系统属性jna.protected,如果设置为true,将导致异常而不是崩溃。这在Windows上默认启用,但在其他平台上,您需要预先链接libjsig.so,因为JNA使用JVM使用的一些相同信号来捕获内存故障。

来自the JavaDoc

  

定义新库并编写测试时并不罕见   遇到导致VM崩溃的内存访问错误。这些经常是   由不正确的映射或传递给本机的无效参数引起的   图书馆。要生成Java错误而不是崩溃VM,请调用   Native.setProtected(true)。并非所有平台都支持这种保护;   如果没有,Native.isProtected()的值将保持为假。

     

注意

     

启用保护模式后,您应该使用jsig   库,如果可用(请参阅信号链)以避免干扰   JVM使用信号。简而言之,设置环境变量   LD_PRELOAD(或LD_PRELOAD_64)到您JRE中libjsig.so的路径   lib目录(通常是${java.home}/lib/${os.arch}/libjsig.so)之前   启动Java应用程序。

即便如此,也不建议将其用于生产代码,当然也不建议在发生故障后继续执行。