JNI_Z_04_属性的操作(非String类型的属性)
2024-08-26 05:56:47
1、步骤 :
(1)、获取 jclass
(2)、获取 类属性字段的id(最后一个参数是 属性字段 的签名)
(3)、获取/设置 类属性字段的值
ZC: 貌似 JNI里面 操作 类属性字段,完全是 无视 访问权限的... 然而 static的类属性字段,稍有不同,要注意。
2、VC6(CPP)的DLL代码:
#include<stdio.h>
#include "jniZ_TjniField.h" JNIEXPORT void JNICALL Java_jniZ_TjniField_NativeFunc(JNIEnv * env, jobject obj)
{
// 获取obj中对象的class对象
jclass clazz = env->GetObjectClass(obj); // 获取 类属性字段的id(最后一个参数是 属性字段 的签名)
jfieldID fieldidFi = env->GetFieldID(clazz, "Fi", "I"); // public
jfieldID fieldidFj = env->GetFieldID(clazz, "Fj", "I"); // protected
jfieldID fieldidFk = env->GetFieldID(clazz, "Fk", "I"); // private
jfieldID fieldidFm = env->GetStaticFieldID(clazz, "Fm", "I"); // (非public/protected/private)的static // 获取 类属性字段的值
jint i = env->GetIntField(obj, fieldidFi);
jint j = env->GetIntField(obj, fieldidFj);
jint k = env->GetIntField(obj, fieldidFk);
jint m = env->GetStaticIntField(clazz, fieldidFm); printf("i : %d\n", i);
printf("j : %d\n", j);
printf("k : %d\n", k);
printf("m : %d\n", m); // 修改number的值为100,这里要注意的是jint对应C++是long型 ∴后面要加一个"L"
env->SetIntField(obj, fieldidFi, + i);
env->SetIntField(obj, fieldidFj, + j);
env->SetIntField(obj, fieldidFk, + k);
env->SetStaticIntField(clazz, fieldidFm, + m);
}
3、Java代码:
package jniZ; import java.lang.reflect.Field; public class TjniField
{
public int Fi = 0;
protected int Fj = 1;
private int Fk = 2;
static int Fm = 3; public native void NativeFunc(); public static void main(String[] args) throws Exception
{
//调用动态链接库
System.loadLibrary("JniField_VC6");
TjniField jniZ = new TjniField();
jniZ.NativeFunc(); // (1)、i
System.out.println("Java Fi : "+jniZ.Fi);
// (2)、j
Class<?> clazz = jniZ.getClass();
Field fieldJ = clazz.getDeclaredField("Fj");
fieldJ.setAccessible(true);
int j = fieldJ.getInt(jniZ);
System.out.println("Java Fj : "+j);
// (3)、k
Field fieldK = clazz.getDeclaredField("Fk");
fieldK.setAccessible(true);
int k = fieldK.getInt(jniZ);
System.out.println("Java Fk : "+k);
// (4)、m
System.out.println("Java Fm : "+Fm);
}
}
4、Java控制台输出:
Java Fi : 100
Java Fj : 101
Java Fk : 102
Java Fm : 103
i : 0
j : 1
k : 2
m : 3
5、
最新文章
- Android切换动画之ViewPager
- hdu 1196 Lowest Bit
- sql2008来远程访问sql2005数据库服务器
- maven学习系列教程,第一课(web项目的搭建)
- 题解西电OJ (Problem 1006 - 转盘游戏)--动态规划
- 如何在ios手机端的Safari浏览器 中“查看网页源代码”
- POJ 1035 Spell checker 简单字符串匹配
- UITableView学习总结
- PHP+Mysql————表单数据插入数据库及数据提取
- SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法
- Java综合题目
- 关于form表单上传图片的一些记录
- Python中协程的实现
- python之路--day6--字符编码
- VS2017 提示警告 IDE0006
- 实现在同一界面打开putty终端连接工具
- CString与UTF8互转代码
- [CQOI2016] 手机号码 (数位dp)
- OO 第三次博客总结
- 从FastDFS官网下载我们需要的安装包