JNI完全指南(四)——对象操作
标签(空格分隔):JNI完全指南
版本:1
作者:陈小默
声明:禁止商业,禁止转载
前一篇:JNI完全指南(三)——引用类型
四、对象操作
4.1 基本操作
4.1.1 创建默认对象
如果我们希望通过一个类创建一个对象,并且没有或不需要调用非默认的构造方法的时候,可以使用如下方式给对象分配空间。
jobject AllocObject(JNIEnv *env, jclass clazz);
- clazz:类。
- return:返回使用clazz类创建的对象,如果clazz没有默认的构造方法,则返回NULL。
存在异常
- InstantiationException:对象初始化异常,这个类可能是抽象的也可能是接口,或者传入的参数与调用的构造器不匹配。
- OutOfMemoryError
4.1.2 创建对象
这里创建对象和Java类似,我们需要指定类信息,并且选择合适的构造器传入参数。以下提供了三种创建对象的方式:
第一种方式
jobject NewObject(JNIEnv *env, jclass clazz,
jmethodID methodID, …);
- clazz:类
- methodID:构造器方法ID
- …:可变参数列表
第二种方式
jobject NewObjectA(JNIEnv *env, jclass clazz,
jmethodID methodID, const jvalue *args);
- args:这里需要传入参数数组
第三种方式
jobject NewObjectV(JNIEnv *env, jclass clazz,
jmethodID methodID, va_list args);
- args:指向变参列表的指针
存在异常
- InstantiationException
- OutOfMemoryError
4.1.3 从对象获取类信息
通过如下方法可以从一个Java对象中获取该对象的Java类信息。
jclass GetObjectClass(JNIEnv *env, jobject obj);
4.1.4 获取一个对象的引用类型
通过如下方法可以得到当前对象的引用类型是全局引用、局部引用还是弱全局引用。
jobjectRefType GetObjectRefType(JNIEnv* env, jobject obj);
- return:当前对象的引用类型。这些类型在
jni.h
文件中的定义如下所示。
typedef enum jobjectRefType {
JNIInvalidRefType = 0,//无效引用
JNILocalRefType = 1,//局部引用
JNIGlobalRefType = 2,//全局引用
JNIWeakGlobalRefType = 3//弱全局引用
} jobjectRefType;
4.1.5 实例运算
在Java中我们使用instanceof来判断一个对象是否是一个类的实例,在JNI中,需要通过如下方法来进行实例运算。
jboolean IsInstanceOf(JNIEnv *env, jobject obj,
jclass clazz);
4.1.6 判断对象是否相同
在Java中使用==可以判断两个引用是否指向同一个对象,在JNI中使用下列方法可以进行相同的判断,无论是全局引用,局部引用还是弱全局引用。
jboolean IsSameObject(JNIEnv *env, jobject ref1,
jobject ref2);
4.2 访问对象中的属性
当我们拥有了一个Java对象,那么在JNI中应该如何操作这个对象中的属性呢?一般而言,在