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、

JNI_Z_04_属性的操作(非String类型的属性)的更多相关文章

  1. .NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题

    最近在做CRM项目时,使用C#调用SAP PI发布的WebService服务时遇到的问题: 向WebService传值为decimal.double.int.DateTime等非string类型数据时 ...

  2. String类型的属性和方法

    × 目录 [1]属性 [2]对象通用方法 [3]访问字符方法[4]字符串拼接[5]创建子串方法[6]大小写转换[7]查找子串位置[8]正则匹配方法[9]去除首尾空格[10]字符串比较 前面的话 前面已 ...

  3. SpringMVC中使用@Value给非String类型注入值

    String类型的@Value注入方式 String类型的直接可以使用 @Value("陈婉清") private String name; 非String类型的@Value注入方 ...

  4. 设置实体类型中String类型的属性值为String.Empty

    /// <summary> /// 将String类型的属性值设置为String.Empty /// </summary> /// <typeparam name=&qu ...

  5. C# 通过ServiceStack 操作Redis——String类型的使用及示例

    1.引用Nuget包 ServiceStack.Redis 我这里就用别人已经封装好的Reids操作类,来演示,并附上一些说明 RedisConfigInfo--redis配置文件信息 /// < ...

  6. JNI_Z_05_方法的操作(没有String类型的参数)

    1.步骤: (1).获取 jclass (2).获取 method的id (3).调用 method ZC: 貌似 JNI里面 操作 类的方法,完全是 无视 访问权限的... 然而 static的方法 ...

  7. 编写一个Car类,具有String类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。

    package com.hanqi.test; public class Car { //构造一个汽车的属性 private String name; //创建getter和setter方法 publ ...

  8. 后端日期类属性date 不接受string类型日期,都是没找到解决的方法,所有前端传回的string字符串都一一转化为java定义的类型

    1.比如日期 我们可以是yyyy-MM-dd 亦可以是 yyyy-MM-dd HH:mm:ss 方法1在java代码中需要的字段上加上注解 写上日期类型,不过这样很麻烦,每个人写了日期类型的接收前端的 ...

  9. JNI_Z_07_方法的操作(没有String类型的参数)_参数的传递方式

    1. 2.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_TjniMethod02.h" JNIEXPORT void ...

随机推荐

  1. PAT 1007 Maximum Subsequence Sum(最长子段和)

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  2. Java方法区和永久代

    Java方法区和永久代 目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9. JRockit是oracle发明的,用于其WebLogic服务器,IBM JVM是IBM ...

  3. tpot从elastic search拉攻击数据之二 配置端口映射

    虽然知道了本地的数据接口位置,但是我们需要的是从远程拉取数据,所以我们需要更改es的ip端口为0.0.0.0:xxxx. 直接修改下图的elasticsearch.yml配置文件,结果发现无效. 这是 ...

  4. Python面向对象高级编程-@property

    使用@property 在绑定属性时,如果直接把属性暴露出去,虽然写起来简单,但是没法检查参数,导致可以把成绩随便改: >>> class Student(object): pass ...

  5. 新手入门:java文件转成jar包再转成exe文件——图文教程

    [本文简介] 由于课程设计的原因,研究着如何把java 程序转成exe,最终成功了,现在把过程记录分享一下. 本文将介绍如何把一个跑在eclipse的java应用,导出成jar文件,再变成exe可执行 ...

  6. Python基础-面向对象2

    一.成员修饰符 共有成员 私有成员:创建方式在成员之前加两个下划线,私有成员无法直接访问,只能间接访问 子类不能继承父类的私有属相私有普通字段的访问方式: class Fansik: def __in ...

  7. alter session set events

    .alter session set events 一.Oracle跟踪文件    Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启动.关闭和运行期间后台进程的活动情况,如表空 ...

  8. cdoj1334郭大侠与Rabi-Ribi

    地址:http://acm.uestc.edu.cn/#/problem/show/1334 题目: 郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Other ...

  9. 执行用例,并生成报告——discover,HTMLRunner

    HTMLRunner需要下载Python3的格式,懒人链接:http://pan.baidu.com/s/1tp3Ts 参考:http://bbs.chinaunix.net/thread-41547 ...

  10. linux redhat下oracle11G安装

    首先由于使用的是虚拟机,所有要修改ip 在LINUX下修改IP分为二种情况, 1.调试时修改IP,仅在当前生效,重启后恢复为原有IP ifconfig eth0 192.168.63.27 netma ...