jni启动问题

时间:2011-02-10 19:53:40

标签: java c dll java-native-interface native-code


我开始研究JNI,根据我的理解,如果加载的dll出现问题,jvm可以在现场终止。
即该过程不能受到保护,例如就像捕捉异常时一样 因此,如果我的理解是正确的,我的问题是,当使用jni时,是否存在针对这种情况的标准方法/模式 或者以不同的方式说明,使用jni设计的流程是为了避免这些问题吗? 或者预计不会出现这样的问题?

谢谢。

3 个答案:

答案 0 :(得分:3)

是的,JVM将终止,这是JNI代码真正难以调试的原因之一。如果您使用的是C ++代码,则可以使用异常,然后将它们映射到Java异常,这至少可以提供一定程度的安全性,但对内存访问不良等问题没有帮助。

从架构的角度来看,我建议尽可能地将代码与JNI分离。创建一个完全可以从C ++ / C测试的类/过程结构,让JNI代码只进行所有转换。如果JVM然后崩溃你至少知道你必须在哪里看。

答案 1 :(得分:1)

这些原则与任何多线程C应用程序没有区别:

  1. 请务必彻底检查所有输入内容。
  2. 始终释放您分配的临时内存。
  3. 确保您的功能可以重复使用。
  4. 不要依赖未定义的行为。
  5. Java虚拟机不为您的本机代码提供额外保护,如果它失败或泄漏,您的VM将失败或泄漏。

答案 2 :(得分:0)

您可以在JNI库中拥有与其他任何内容完全相同的错误处理范围。

您可以使用try / catch。如果您使用的是Windows,则可以使用SEH。如果您使用的是Linux,则可以调用sigaction。

但是,如果你陷入困境并且有一个SIGSEGV,那么无论你是否试图捕捉到这个信号,你的JVM都可能是吐司。