我开始研究JNI,根据我的理解,如果加载的dll出现问题,jvm可以在现场终止。
即该过程不能受到保护,例如就像捕捉异常时一样
因此,如果我的理解是正确的,我的问题是,当使用jni时,是否存在针对这种情况的标准方法/模式
或者以不同的方式说明,使用jni设计的流程是为了避免这些问题吗?
或者预计不会出现这样的问题?
谢谢。
答案 0 :(得分:3)
是的,JVM将终止,这是JNI代码真正难以调试的原因之一。如果您使用的是C ++代码,则可以使用异常,然后将它们映射到Java异常,这至少可以提供一定程度的安全性,但对内存访问不良等问题没有帮助。
从架构的角度来看,我建议尽可能地将代码与JNI分离。创建一个完全可以从C ++ / C测试的类/过程结构,让JNI代码只进行所有转换。如果JVM然后崩溃你至少知道你必须在哪里看。
答案 1 :(得分:1)
这些原则与任何多线程C应用程序没有区别:
Java虚拟机不为您的本机代码提供额外保护,如果它失败或泄漏,您的VM将失败或泄漏。
答案 2 :(得分:0)
您可以在JNI库中拥有与其他任何内容完全相同的错误处理范围。
您可以使用try / catch。如果您使用的是Windows,则可以使用SEH。如果您使用的是Linux,则可以调用sigaction。
但是,如果你陷入困境并且有一个SIGSEGV,那么无论你是否试图捕捉到这个信号,你的JVM都可能是吐司。