JNI_Z_04_属性的操作(非String类型的属性)
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类型的属性)的更多相关文章
- .NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题
最近在做CRM项目时,使用C#调用SAP PI发布的WebService服务时遇到的问题: 向WebService传值为decimal.double.int.DateTime等非string类型数据时 ...
- String类型的属性和方法
× 目录 [1]属性 [2]对象通用方法 [3]访问字符方法[4]字符串拼接[5]创建子串方法[6]大小写转换[7]查找子串位置[8]正则匹配方法[9]去除首尾空格[10]字符串比较 前面的话 前面已 ...
- SpringMVC中使用@Value给非String类型注入值
String类型的@Value注入方式 String类型的直接可以使用 @Value("陈婉清") private String name; 非String类型的@Value注入方 ...
- 设置实体类型中String类型的属性值为String.Empty
/// <summary> /// 将String类型的属性值设置为String.Empty /// </summary> /// <typeparam name=&qu ...
- C# 通过ServiceStack 操作Redis——String类型的使用及示例
1.引用Nuget包 ServiceStack.Redis 我这里就用别人已经封装好的Reids操作类,来演示,并附上一些说明 RedisConfigInfo--redis配置文件信息 /// < ...
- JNI_Z_05_方法的操作(没有String类型的参数)
1.步骤: (1).获取 jclass (2).获取 method的id (3).调用 method ZC: 貌似 JNI里面 操作 类的方法,完全是 无视 访问权限的... 然而 static的方法 ...
- 编写一个Car类,具有String类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。
package com.hanqi.test; public class Car { //构造一个汽车的属性 private String name; //创建getter和setter方法 publ ...
- 后端日期类属性date 不接受string类型日期,都是没找到解决的方法,所有前端传回的string字符串都一一转化为java定义的类型
1.比如日期 我们可以是yyyy-MM-dd 亦可以是 yyyy-MM-dd HH:mm:ss 方法1在java代码中需要的字段上加上注解 写上日期类型,不过这样很麻烦,每个人写了日期类型的接收前端的 ...
- JNI_Z_07_方法的操作(没有String类型的参数)_参数的传递方式
1. 2.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_TjniMethod02.h" JNIEXPORT void ...
随机推荐
- 记录--jquery 获取父级、子级、兄弟元素 + 实例
需求如下: 三条数据,需点击其中一条数据在其下面展示与此数据关联的图片.主要功能可能是在点击的数据下增加显示行 思路: 把需要点击增加的数据先隐藏.点击后再将其显示出来. 知识点: jQuery.pa ...
- php 正则表达式三.模式修正
1.贪婪模式和懒惰模式, 贪婪模式:php中正则默认是贪婪模式,匹配尽可能多 的字符,比如 $pattern='/a+b/'; $subject='aaaaaaaaab,那么可能会preg_match ...
- 模块 - random/string/os/sys/shutil/zipfile/tarfile
random 模块 方法: >>> random.randint(1,3) #会包含 1 2 3 3 >>> random.randrange(1,3) #会包含 ...
- 2015-03-22——js常用其它方法
Function Function.prototype.method = function (name, func) { this.prototype[name] = func; //此时th ...
- scrapy item
item item定义了爬取的数据的model item的使用类似于dict 定义 在items.py中,继承scrapy.Item类,字段类型scrapy.Field() 实例化:(假设定义了一个名 ...
- pandas 如何判断指定列是否(全部)为NaN(空值)
判断某列是否有NaN df['$open'].isnull().any() # 判断open这一列列是否有 NaN 判断某列是否全部为NaN df['$open'].isnull().all() # ...
- django的cookie和session以及缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
- springboot整合JPA创建数据库表失败
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table t_s ...
- mysql 时间处理函数
(1)求两个时间戳之间相差的天数 SELECT TIMESTAMPDIFF(DAY, FROM_UNIXTIM ...
- Taking a screen shot of a window using Delphi code is rather easy.
Taking a screen shot of a window using Delphi code is rather easy. A screen shot (screen capture) is ...