JNI完全指南(二)——类与异常
来源:互联网 发布:淘宝微信内部优惠卷群 编辑:程序博客网 时间:2024/06/05 20:31
JNI完全指南(二)——类与异常
标签(空格分隔): JNI完全指南
版本:1作者:陈小默声明:禁止商业,禁止转载
发布于作业部落、简书、CSDN博客
上一篇:JNI完全指南(一)——数据类型
- JNI完全指南二类与异常
- 二类与异常
- 1 类
- 11 加载类
- 12 查找一个类
- 13 获取父类
- 14 类型转换
- 2 异常
- 21 抛出已有的异常对象
- 22 抛出一个新异常对象
- 23 获取JVM抛出的异常
- 24 输出错误日志
- 25 清空异常信息
- 26 产生一个严重的错误
- 27 检查是否存在异常信息
- 1 类
二、类与异常
2.1 类
2.1.1 加载类
我们可以使用下列方法通过类定义去加载一个类。
jclass DefineClass(JNIEnv *env, const char *name, jobject loader,
const jbyte *buf, jsize bufLen);
- name:类的全名,必须是被UTF-8编码过的字符串。
- loader:类加载器。
- buf:包含类数据的缓冲区。这个缓冲区包含一个原始类数据,并且要求这个类在调用此方法前没有被JVM所引用。
- bufLen:缓冲区长度。
- return:java类对象。发生错误时返回NULL。
其间可能会抛出如下异常:
- ClassFormatError:类格式错误。
- ClassCircularityError:类循环错误。如果一个类或接口继承了自己。
- OutOfMemoryError:内存溢出。
- SecurityException:安全性错误。如果调用者试图在Java包结构上定义一个类。
2.1.2 查找一个类
通过以下方法我们可以通过类名查找到一个类。
jclass FindClass(JNIEnv *env, const char *name);
- name:类的全名。使用UTF-8编码,其中分隔符使用
/
表示。- return:java类对象。发生错误时返回NULL。
其间可能会抛出如下异常:
- ClassFormatError
- ClassCircularityError
- NoClassDefFoundError:没有找到相应的类对象。
- OutOfMemoryError
2.1.3 获取父类
通过如下方法我们可以获取到一个类的父类的类对象
jclass GetSuperclass(JNIEnv *env, jclass clazz);
- clazz:需要查询的类对象。
- return:clazz的父类类对象。如果clazz是Object类对象或者clazz是接口的类信息,返回NULL。
2.1.4 类型转换
当我们将一个对象从一种类型转换为另一种类型之前,我们必须确保这种类型转换是安全的。我们可以通过如下方法去判断这两种类型是否可以互相转换。
jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1,
jclass clazz2);
- clazz1:原始类型。
- class2:目标类型。
- return:当前类型转换是否安全。
2.2 异常
本节内容介绍JNI中异常操作相关的方法。C++中可以使用其内部的异常机制,但是这套机制抛出的异常并不会传递给我们的JVM,所以为了你补这个缺点,JNI实现了一套可以和JVM进行交流的异常机制。
2.2.1 抛出已有的异常对象
我们可以通过如下方法抛出一个异常。
jint Throw(JNIEnv *env, jthrowable obj);
- obj:一个java.lang.Throwable对象。
- return:异常抛出结果。0表示异常正常抛出到JVM,否则异常抛出失败。
2.2.2 抛出一个新异常对象
在2.3.1中我们可以抛出一个已有的异常对象。那么对于我们想抛出的异常可以采用如下方法。
jint ThrowNew(JNIEnv *env, jclass clazz,
const char *message);
- clazz:待抛出的异常类。
- message:异常消息。要求UTF-8编码。
- return:异常抛出结果。0表示异常正常抛出到JVM,否则异常抛出失败。
2.2.3 获取JVM抛出的异常
如果我们需要知道我们之前的操作是否存在JVM抛出的异常时,我们可以调用如下方法获取异常对象,注意:即使我们获取到了异常对象,这个异常仍然在JVM中存在,直到我们调用ExceptionClear方法清空异常。
jthrowable ExceptionOccurred(JNIEnv *env);
- return:当前发生的异常对象。如果没有异常抛出则返回NULL。
2.2.4 输出错误日志
当我们拦截到一个异常,我们可以使用如下方法打印错误栈中的内容。就像Java中的printStackTrace:
void ExceptionDescribe(JNIEnv *env);
2.2.5 清空异常信息
调用以下方法可以清空当前产生的全部异常信息
void ExceptionClear(JNIEnv *env);
2.2.6 产生一个严重的错误
对于上述异常,我们可以产生也可以拦截。但是如果发生了一些错误导致我们的程序无法再正常运行下去了,则可以发送一个错误信息给JVM,此时程序将被终止。
void FatalError(JNIEnv *env, const char *msg);
- msg:错误信息。UTF-8。
2.2.7 检查是否存在异常信息
我们可以通过以下方法查看当前有没有异常产生。
jboolean ExceptionCheck(JNIEnv *env);
- return:是否存在异常信息。
下一篇:JNI完全指南(三)——引用类型
参考文献:
[1]ORACLE guides for JNI——Chapter 4: JNI Functions
- JNI完全指南(二)——类与异常
- JNI完全指南(五)——字符串与数组
- JNI完全指南(十)——JavaVM与JNIEnv
- JNI完全指南(一)——数据类型
- JNI完全指南(七)——多线程
- JNI完全指南(八)——NIO
- JNI完全指南(九)——反射
- JNI完全指南(三)——引用类型
- JNI完全指南(四)——对象操作
- JNI完全指南(六)——本地方法
- (4.1.27.5) JNI/NDK开发指南(二)——JNI数据类型及与Java数据类型的映射关系
- JNI/NDK开发指南(十一)——JNI异常处理
- JNI/NDK开发指南(十一)——JNI异常处理
- JNI/NDK开发指南(十一)——JNI异常处理
- JNI/NDK开发指南(十一)——JNI异常处理
- JNI/NDK开发指南(十一)——JNI异常处理
- JNI/NDK开发指南(十一)——JNI异常处理
- JNI完全手册(二)
- Linux 服务器模型
- SQLServer解决孤立用户问题
- Linux常用命令-文件处理命令
- weblogic发送https请求的证书错误的解决办法
- iOS项目添加VPN
- JNI完全指南(二)——类与异常
- spacemacs c++ 智能提示
- Ubuntu15.04源码安装Node.js
- php去除空数组且数组键名重置
- DBMS_REDEFINITION用法
- mysql安装与配置
- rabbitmq http.api
- 精心整理python自动化测试小技巧二
- mybatis中常用的标签