@cxm-2016
2016-11-15T15:08:49.000000Z
字数 2280
阅读 7480
JNI完全指南
版本:1
作者:陈小默
声明:禁止商业,禁止转载
上一篇:JNI完全指南(一)——数据类型
我们可以使用下列方法通过类定义去加载一个类。
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包结构上定义一个类。
通过以下方法我们可以通过类名查找到一个类。
jclass FindClass(JNIEnv *env, const char *name);
- name:类的全名。使用UTF-8编码,其中分隔符使用
/
表示。- return:java类对象。发生错误时返回NULL。
其间可能会抛出如下异常:
- ClassFormatError
- ClassCircularityError
- NoClassDefFoundError:没有找到相应的类对象。
- OutOfMemoryError
通过如下方法我们可以获取到一个类的父类的类对象
jclass GetSuperclass(JNIEnv *env, jclass clazz);
- clazz:需要查询的类对象。
- return:clazz的父类类对象。如果clazz是Object类对象或者clazz是接口的类信息,返回NULL。
当我们将一个对象从一种类型转换为另一种类型之前,我们必须确保这种类型转换是安全的。我们可以通过如下方法去判断这两种类型是否可以互相转换。
jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1,
jclass clazz2);
- clazz1:原始类型。
- class2:目标类型。
- return:当前类型转换是否安全。
本节内容介绍JNI中异常操作相关的方法。C++中可以使用其内部的异常机制,但是这套机制抛出的异常并不会传递给我们的JVM,所以为了你补这个缺点,JNI实现了一套可以和JVM进行交流的异常机制。
我们可以通过如下方法抛出一个异常。
jint Throw(JNIEnv *env, jthrowable obj);
- obj:一个java.lang.Throwable对象。
- return:异常抛出结果。0表示异常正常抛出到JVM,否则异常抛出失败。
在2.3.1中我们可以抛出一个已有的异常对象。那么对于我们想抛出的异常可以采用如下方法。
jint ThrowNew(JNIEnv *env, jclass clazz,
const char *message);
- clazz:待抛出的异常类。
- message:异常消息。要求UTF-8编码。
- return:异常抛出结果。0表示异常正常抛出到JVM,否则异常抛出失败。
如果我们需要知道我们之前的操作是否存在JVM抛出的异常时,我们可以调用如下方法获取异常对象,注意:即使我们获取到了异常对象,这个异常仍然在JVM中存在,直到我们调用ExceptionClear方法清空异常。
jthrowable ExceptionOccurred(JNIEnv *env);
- return:当前发生的异常对象。如果没有异常抛出则返回NULL。
当我们拦截到一个异常,我们可以使用如下方法打印错误栈中的内容。就像Java中的printStackTrace:
void ExceptionDescribe(JNIEnv *env);
调用以下方法可以清空当前产生的全部异常信息
void ExceptionClear(JNIEnv *env);
对于上述异常,我们可以产生也可以拦截。但是如果发生了一些错误导致我们的程序无法再正常运行下去了,则可以发送一个错误信息给JVM,此时程序将被终止。
void FatalError(JNIEnv *env, const char *msg);
- msg:错误信息。UTF-8。
我们可以通过以下方法查看当前有没有异常产生。
jboolean ExceptionCheck(JNIEnv *env);
- return:是否存在异常信息。
下一篇:JNI完全指南(三)——引用类型