jni基本操作 2. 操作java中的属性


系列文章

jni基本操作 1. java 层创建 native 方法,并生成对应 jni 函数
jni基本操作 2. 操作java中的属性
jni基本操作 3. 操作java中的方法
jni基本操作 4. 加载与卸载函数,动态注册与反注册本地方法
jni基本操作 5.多线程临界区(类似 java 的同步代码块)处理


I. 本地代码中操作 java 属性

先获取 java 成员属性或静态属性的 jfieldID;

然后可以 获取 或 设置 该 属性 ID 对应的 值 。


II. jni.h 中定义了 jfieldID

//java 属性 ID 结构体
struct _jfieldID;                       /* opaque structure 不透明,即未在本头文件中具体实现 */
typedef struct _jfieldID* jfieldID;     /* field IDs */

III. 获取成员属性对应 jfieldID

jclass clz = env->GetObjectClass(jobj);  //先获取 jclass
jfieldID fid = env->GetFieldID(clz, "mix", "I"); //最后一个参数是属性的类型描述字符串

IV. 获取静态属性对应 jfieldID

//若在成员方法中,如上获取 clz 变量;
//若在静态方法中,则使用 jni 函数中的 jclass类型变量 即可;
jfieldID fid = env->GetStaticFieldID(clz, "mix", "I");//最后一个参数是属性的类型描述字符串

V. 获取jfieldID 对应的属性值

jobject fobj = env->GetObjectField(obj, fieldID);

如上,是获取成员属性,id 为 fieldID, obj 是属性所在的 jobject ,返回 jobject

Get[Type]Field, Type 包括 jobject与所有基本数据类型;其参数 (jobject obj, jfieldID fieldID)

GetStatic[Type]Filed,获取静态属性;其参数(jclass clazz, jfieldID staticFieldID )


VI. 设置jfieldID 对应的属性值

Set[Type]Field(jobject obj, jfieldID fieldID, type);
SetStatic[Type]Field(jclass clazz, jfieldID fieldID, type);

VII. 关于属性类型描述字符串,用于获取 jfieldID

Type SignatureJava Type
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
Lfully-qualified-class ; fully-qualified-class
[ typetype[]

L 表示一个引用对象(String 类型也用它表示),需要 L 开头,后紧跟一个完全限定的类名,结尾还有一个分号;
[I 表示一个一维 整型数组。 如 [[Ljava/lang/String; 表示二维String 型数组

如,

int[] arr ==> "[I"
String[][] arr ==> "[[Ljava/lang/String;"
short sh  ==> "S"


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值