我必须使用JNA将我的Java应用程序链接到外部库。 我没有它的来源,然后我无法改变它。 有时会发生这个外部库崩溃我的应用程序的jvm,我不知道可能是什么...也许是外部库的非托管异常,我看到的只是一个应用程序崩溃时调用外部本机方法。 有没有办法避免整个jvm崩溃,只是通过JNA得到一个例外?
要更好地详细说明问题:此库是智能卡驱动程序。在一些s.o.自动更新或在s.o之后待机过程有时我得到了崩溃。没有日志或错误,只是jvm进程的结束。
答案 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应用程序。
即便如此,也不建议将其用于生产代码,当然也不建议在发生故障后继续执行。