Android NDK开发篇:Java与原生代码通信(异常处理)

Posted kenny.wmh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK开发篇:Java与原生代码通信(异常处理)相关的知识,希望对你有一定的参考价值。

一、捕获异常

    异常处理是Java中的功能,在android中使用SDK进行开发的时候经常要用到。Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层。执行原生代码出现了问题,例如使用了空指针、内存泄漏,并且没有做相应的检测盒异常抛出,APP会马上闪退,没有任何提示。

    JNI中的异常处理和Java的不一样。Java中的异常处理,是直接捕获,然后做相应的处理。JNI要求开发人员在异常发生之后显式实现异常处理流。例如以下例子:

  1. public class JavaClass {  
  2.     /** 
  3.      * 异常抛出方法 
  4.      */  
  5.     private void throwException() throws NullPointerException {  
  6.         throw new NullPointerException("Null pointer");  
  7.     }  
  8.       
  9.     /** 
  10.      * 原生方法 
  11.      */  
  12.     private native void nativeMethod();  
  13. }  

    在原生方法nativeMethod中调用throwException方法,nativeMethod原生方法需要显示地做异常处理。JNI提供了ExceptionOccurred函数查询虚拟机是否有挂起的异常。在使用完之后,还需要ExceptionClear函数显式地清除异常。

 
  1. jthrowable ex;  
  2.   
  3. //...  
  4.   
  5. (*env)->CallVoidMethod(env, instance, throwExceptionId);  
  6. ex = (*env)->ExceptionOccurred(env);  
  7. if (0 != ex) {  
  8.     (*env)->ExceptionClear(env);  
  9. }  

  二、抛出异常

    JNI也允许原生代码抛出异常。由于异常是Java的类,所以在JNI中需要用FindClass函数找到异常类,用ThrowNew函数就可以初始化并抛出新的异常。例如:

 
  1. jclass clazz;  
  2.   
  3. //...  
  4.   
  5. clazz = (*env)->FindClass(env, "java/lang/NullPointerException");  
  6. if (0 != clazz) {  
  7.     (*env)->ThrowNew(env, clazz, "Exception message.");  
  8. }  

    因为原生方法不受虚拟机的控制,所以抛出的异常并不会停止原生方法的执行。在抛出异常的时候,需要释所有已经分配的资源,例如内存资源...通过JNIEnv接口获得的局部引用,在原生方法返回之后会被虚拟机自动释放。

以上是关于Android NDK开发篇:Java与原生代码通信(异常处理)的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK开发篇:Java与原生代码通信(异常处理)

Android NDK开发篇:Java与原生代码通信(异常处理)

Android NDK开发学习思路以及知识要点(音视频篇)

Android NDK开发入门基础

Android NDK开发入门基础

如何定位Android NDK开发中遇到的错误