[关闭]
@cxm-2016 2016-11-15T15:08:49.000000Z 字数 2280 阅读 7535

JNI完全指南(二)——类与异常

JNI完全指南

版本:1
作者:陈小默
声明:禁止商业,禁止转载

发布于作业部落简书CSDN博客


上一篇:JNI完全指南(一)——数据类型



二、类与异常

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注