JNI完全指南(四)——对象操作

本文详细介绍了JNI中对象的基本操作,包括创建对象、获取类信息、实例运算、访问对象属性及调用实例和静态方法。讲解了各种方法如NewObject、GetObjectClass、IsInstanceOf等,并提供了异常处理和方法ID的获取。
摘要由CSDN通过智能技术生成

JNI完全指南(四)——对象操作

标签(空格分隔):JNI完全指南

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

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


前一篇: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中应该如何操作这个对象中的属性呢?一般而言,在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值