案例三:C代码访问Java对象的实例变量
获取对象的实例变量的步骤:
1. 通过GetObjectClass()方法获得此对象的类引用
2. 通过类引用的GetFieldID()方法获得实例变量的Field ID.
你需要提供 变量名,字段类型描述符
- 对于Java 类, 字段描述符格式为 "L<类全称>;" 类全称中,点"."用 "/"代替。例如,String 的描述符为"Ljava/lang/String;"
注意:这里不要漏了分号";"
- 对于基本类型,则有固定标识。注:这里不需要分号。
int => "I" ,byte => "B",short => "S",long => "J",float => "F",double => "D",char => "C",boolean => "Z"
- 对于数组,则结合以上类型描述符,加上前缀"[",
如Object数组,用"[L/java/lang/Object;"表示
int数组,用"[I"表示
3. 基于FieldID,通过GetObjectField()方法或Get<基本类型>Field()方法获取实例变量。
4. 如果需要更新实例变量,可以使用SetObjectField()或Set<基本类型>Field()函数进行
以下是JNI用于获取实例变量的函数:(来自于头文件jni.h)
此案例所有文件:
(1)创建Java程序
定义两个实例变量,一个为基本类型,另一个为对象类型。利用C代码对其进行更改,然后输出结果,校验其实例变量是否改变。
(2)编译Java程序,并生成相关头文件
(3)编写源文件实现。
根据上述描述的获取成员变量的步骤进行。
注:由于String在c语言中没有直接映射的类型,只能通过相关函数转换为以'\0'结尾的字符数组。
(4)生成动态链接库,注这里直接指定库名为libdemo3.so,至于为何要加前缀lib,请看前文
(5)执行Java程序
由图可知,C代码成功改变了Java对象实例变量的值。
- JNI (Java Native Interface)(一)
- JNI (Java Native Interface)(二)
- JNI (Java Native Interface)(三)
- JNI (Java Native Interface)(四)