JNI异常

作者: 欠揍的星星 | 来源:发表于2019-09-25 14:23 被阅读0次

JNI异常

JNI允许native方法引发任意Java异常。native代码还可以处理未解决的Java异常。未处理的Java异常将传播回VM虚拟机。

异常和错误代码

在两种情况下,程序员需要检查异常:

  • JNI函数调用Java方法并返回Java方法的结果。程序员必须调用ExceptionOccurred()以检查在执行Java方法期间可能发生的异常。

  • 一些JNI数组访问函数不返回错误代码,但可能会引发ArrayIndexOutOfBoundsExceptionArrayStoreException

在所有其他情况下,非错误返回值可确保不会引发任何异常。

异步异常

在有多个线程的情况下,当前线程以外的其他线程可能会发布异步异常。异步异常不会立即影响当前线程中本机代码的执行,直到:

  • 本地代码调用可能引发同步异常的JNI函数之一

  • 本地代码用于ExceptionOccurred()显式检查同步和异步异常。

请注意,只有那些可能引发同步异常的JNI函数才会检查异步异常。

本地方法ExceptionOccurred()应在必要的地方插入检查(例如在没有其他异常检查的紧密循环中),以确保当前线程在合理的时间内响应异步异常。

异常处理

处理本地代码中的异常有两种方法:

  • 本地方法可以选择立即返回,从而导致引发本机方法调用的Java代码中引发异常。

  • 本地代码可以通过调用清除异常方法ExceptionClear()清除异常,然后执行自己的异常处理代码。

引发异常后,本地代码必须首先清除异常,然后再进行其他JNI调用。当有异常发生时,可以安全调用的JNI函数是:

  ExceptionOccurred()  //异常检测,返回一个异常对象,否则返回NULL
  ExceptionDescribe()  //日志中打印异常
  ExceptionClear()       //清除异常堆栈信息 
  ExceptionCheck()     //检查是否发生了异常,若有异常返回JNI_TRUE,否则返回JNI_FALSE 
  ReleaseStringChars()
  ReleaseStringUTFChars()
  ReleaseStringCritical()
  Release<Type>ArrayElements()
  ReleasePrimitiveArrayCritical()
  DeleteLocalRef()
  DeleteGlobalRef()
  DeleteWeakGlobalRef()
  MonitorExit()
  PushLocalFrame()
  PopLocalFrame()

与异常相关的方法

Throw(jthrowable obj)  //抛出异常,可以在Java层通过try...catch处理
ThrowNew(jclass clazz, const char* message)  //在当前线程触发一个异常,并自定义输出异常信息 
FatalError(const char* msg) //致命异常,用于输出一个异常信息,并终止当前VM实例(即退出程序)

相关文章

网友评论

      本文标题:JNI异常

      本文链接:https://www.haomeiwen.com/subject/dtwxrctx.html