文章目录
系列文章
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 Signature | Java Type |
---|---|
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L | fully-qualified-class ; fully-qualified-class |
[ type | type[] |
L 表示一个引用对象(String 类型也用它表示),需要 L 开头,后紧跟一个完全限定的类名,结尾还有一个分号;
。
[I 表示一个一维 整型数组。 如 [[Ljava/lang/String; 表示二维String 型数组
如,
int[] arr ==> "[I"
String[][] arr ==> "[[Ljava/lang/String;"
short sh ==> "S"