`
isiqi
  • 浏览: 16358164 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JNI异常的处理

阅读更多

Java中需要调用C代码,C代码中反过来又会操作Java中的对象,这就需要在C代码中处理Java操作可能出现的异常。如果不进行处理,一旦发生异常,C代码部分就会直接退出,同时抛给调用它的Java代码一个莫名其妙的错误(可能是一个没有任何意义的Exception)直接看这个错误是无法分析真正的错误原因的。
所以C代码中必须要处理这些异常,要么将其抛出,要么忽略掉。

下面是专用的JNI函数,可以对异常进行处理。

Throw():丢弃一个现有的异常对象;在固有方法中用于重新丢弃一个异常。
ThrowNew():生成一个新的异常对象,并将其丢弃。
ExceptionOccurred():判断一个异常是否已被丢弃,但尚未清除。
ExceptionDescribe():打印一个异常和堆栈跟踪信息。
ExceptionClear():清除一个待决的异常。
FatalError():造成一个严重错误,不返回。

在所有这些函数中,最不能忽视的就是ExceptionOccurred()和ExceptionClear()。大多数JNI函数都能产生异常,而且没有象在Java的try块内的那种语言特性可供利用。所以在每一次JNI函数调用之后,都必须调用ExceptionOccurred(),了解异常是否已被丢弃。若侦测到一个异常,可选择对其加以控制(可能时还要重新丢弃它)。然而,必须确保异常最终被清除。这可以在自己的函数中用ExceptionClear()来实现;若异常被重新丢弃,也可能在其他某些函数中进行。

举个最简单的例子,如果调用Java中的方法后出现异常,忽略。

jobject objectAttr = (*env)->CallObjectMethod(env, objectDocument, createAttributeMid, stoJstring(env, "ABC"));
// deal with exception
exc = (*env)->ExceptionOccurred(env);
if(exc) {
(*env)->ExceptionClear(env);
doSomething();
}

分享到:
评论

相关推荐

    Android JNI 异常处理 (十一)

    ### JNI异常处理基础 1. **Java异常到C++的转换**:当Java代码抛出异常时,如果这个异常在JNI函数内部没有被捕获,JNI会自动检测到这个异常并转换为一个本地异常。转换后的异常通常是一个`JNIEnv`指针上的错误标记...

    android jni抛出异常

    标签“android jni exception”进一步强调了我们在讨论的是与JNI异常处理相关的话题。在实际开发中,我们还需要注意以下几点: 1. **错误检查**:在JNI代码中进行适当的错误检查,确保在调用Java方法或处理本地资源...

    android-jni.zip_Android jni_android_jni_jni android

    五、JNI异常处理 在本地方法中,如果发生错误,可以使用JNIEnv指针抛出Java异常。Java代码可以通过检查并处理这些异常来捕获错误。 六、JNI内存管理 在本地代码中分配的内存需要手动释放,否则可能导致内存泄漏。...

    android-jni操作指南.zip

    五、JNI异常处理 原生代码可以通过JNIEnv抛出Java异常,也可以捕获Java层抛出的异常。需要注意的是,原生代码中的异常处理机制与Java不同,需要特别处理。 六、JNI与多线程 由于Android的线程模型,每个Java虚拟机...

    JNI 简介与实现毕业设计—(包含完整源码可运行).zip

    5. **JNI异常处理**:介绍如何在本地代码中捕获和抛出Java异常。 6. **内存管理**:探讨如何在本地代码中分配和释放内存,以及使用`GlobalRef`和`LocalRef`管理Java对象引用,防止内存泄漏。 7. **线程安全**:讨论...

    JNI编程指南(E文)

    #### 六、JNI异常处理 当在本地方法中发生错误时,可以通过JNI API抛出Java异常。常见的异常包括`JNIEnv::ExceptionCheck`和`JNIEnv::ThrowNew`等方法。 #### 七、JNI线程模型 JNI支持多线程环境下的编程。本地...

    OPhone平台Native开发与JNI机制详解

    7. **错误处理与调试**:JNI编程中常见的错误和调试方法,如JNI异常处理、日志输出等。 8. **性能优化**:使用JNI进行性能优化的策略,如减少Java-C++间的函数调用、缓存JNIEnv指针等。 9. **实例分析**:可能包含...

    jni方法里面抛出异常

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它...综上所述,理解和掌握JNI中的异常处理是Android开发中的重要技能,它能帮助开发者在混合编程时更好地处理错误和异常情况,保证程序的健壮性和稳定性。

    jni操作arraylist对象

    5. **处理可能出现的异常**:在JNI中,Java抛出的异常会变成本地异常。我们需要检查是否发生异常,并适当地处理它们。 ```c++ if (env->ExceptionCheck()) { // 处理异常 env->ExceptionDescribe(); env->...

    JDK16-java-se-language-updates.pdf

    1. JNI 异常处理: JDK 16 中,JNI 异常处理机制得到了改进,提高了 Java 应用程序的稳定性。 2. Java 反射机制优化: JDK 16 中,Java 反射机制得到了优化,提高了 Java 应用程序的性能。 结论 JDK 16 中的 Java ...

    ndk处理图片的项目

    8. **JNI异常处理**:在Java和C++之间传递数据时,需要处理可能出现的异常情况,确保程序的健壮性。 9. **Bitmap对象与原生缓冲区**:在Java层,Bitmap对象是图片数据的主要载体。在NDK中,可能需要将Bitmap的数据...

    JNI处理各种类型数据,不包含获取Java的HashMap

    6. 异常处理:在JNI中,使用`ExceptionOccurred`检查是否发生了异常,如果有,可以用`ExceptionDescribe`打印异常信息,`ExceptionClear`清除当前的异常。 7. 类和方法ID:在C/C++中,你需要先获取类的`jclass`,...

    jni.h头文件

    5. **异常处理**:JNI提供了处理和抛出Java异常的机制,如`ExceptionOccurred`, `ExceptionDescribe`, `ExceptionClear`等。 `jni_md.h`头文件是与特定平台相关的,通常由JDK自动生成,包含了针对不同操作系统和...

    JniCallback.zip_Android jni_android_jni android_jni callback_jni

    - 本地方法的异常处理要特别注意,因为C/C++代码无法直接捕获Java异常。 通过理解并实践这个“JniCallback.zip”中的示例,开发者可以更好地掌握JNI回调的用法,从而在实际项目中灵活地使用这一功能,提高应用的...

    JNI规范中文版

    8. **异常处理**:JNI提供了异常检查和抛出机制,如`ExceptionOccurred`和`Throw`函数,可以帮助开发者处理在本地代码中出现的异常。 9. **线程管理**:JNI允许本地代码创建和操作Java线程。每个Java线程都有一个与...

    JNI攻略之九――操作异常

    ### JNI攻略之九——操作异常 #### 一、概述 JNI (Java Native Interface) 是 Java 平台标准的一部分,它允许 Java 代码和其他语言写的代码进行...希望这篇文章能够帮助读者更好地理解和应用 JNI 中的异常处理技术。

    JNI-study(讲JNI的书,中文版)

    5. 异常处理:介绍在JNI中如何捕获和抛出Java异常,以及如何在本地代码中进行错误处理。 6. 类和对象操作:讲解如何通过JNI访问和操作Java类的静态字段、实例字段,以及如何调用静态方法和实例方法。 7. 多线程...

    jni操作list集合,来存储对象

    6. **异常处理**: JNI调用Java方法时可能会抛出异常,需要通过`ExceptionOccurred`检查并处理异常。 总结起来,JNI操作Java的List集合存储对象涉及到以下步骤: - 定义Java层的JNI接口。 - 初始化JNI环境,找到...

    JNI CHM文档以及JNI编程规范

    6. **异常处理**:JNI允许本地代码抛出和捕获Java异常,并提供了相应的API。 7. **线程支持**:JNI支持多线程环境,可以创建和管理Java线程,以及同步原语。 8. **字符串处理**:JNI提供了Java字符串和本地字符串...

    JNI实现示例DEMO

    通过这个DEMO,你可以了解到JNI的基本工作流程,但实际应用中可能涉及更复杂的数据类型转换、异常处理以及多线程同步等问题。熟练掌握JNI能够帮助你充分利用Java的跨平台特性,同时结合本地代码的优势,提升应用性能...

Global site tag (gtag.js) - Google Analytics