Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量
JNI访问 Java 实例变量和静态变量
Java 中的实例变量和静态变量,在本地代码中如何来访问和修改。静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过类名.变量名来访问。实例变量也称为成员变量(属性),每个实例都拥有一份实例变量数据的拷贝,它们之间修改后的数据互不影响。
直接上代码:
JAVA
public class Person {
//成员变量
private String hobby;
//静态变量
private static int happiness;
public String getHobby() {
return hobby;
}
public static int getHappiness() {
return happiness;
}
//Native方法中设置成员变量的值
public native boolean setHobby();
//Native方法中设置静态变量的值
public native boolean setHappiness();
}
Native
JNIEXPORT jboolean JNICALL
Java_org_professor_jni_bean_Person_setHobby(JNIEnv *env, jobject instance) {
//1.获取类类型的Class对象
jclass personClass = (*env)->FindClass(env, "org/professor/jni/Person");
if (NULL == personClass) {
__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND CLASS");
return JNI_FALSE;
}
//2.获取属性ID
jfieldID hobbyFiledID = (*env)->GetFieldID(env, personClass, "hobby", "Ljava/long/String");
if (NULL == hobbyFiledID) {
__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND Hobby FiledID");
return JNI_FALSE;
}
//3.实例属性,通过对象获取属性值
jstring hobbyFiledStr = (*env)->GetObjectField(env, instance, hobbyFiledID);
if (NULL != hobbyFiledStr) {
const char *hobby = (*env)->GetStringUTFChars(env, hobbyFiledStr, NULL);
if (NULL != hobby) {
__android_log_print(ANDROID_LOG_ERROR, "PERSON Hobby", hobby);
(*env)->ReleaseStringChars(env, hobbyFiledStr, hobby);
}
}
//4.设置属性值
jstring jHobby = (*env)->NewStringUTF(env, "BASKETBALL,RUN");
(*env)->SetObjectField(env, instance, hobbyFiledID, jHobby);
//5.删除局部引用变量
(*env)->DeleteLocalRef(env, personClass);
(*env)->DeleteLocalRef(env, hobbyFiledStr);
(*env)->DeleteLocalRef(env, jHobby);
return JNI_TRUE;
}
JNIEXPORT jboolean JNICALL
Java_org_professor_jni_bean_Person_setHappiness(JNIEnv *env, jobject instance) {
//1.获取类类型的Class对象
jclass personClass = (*env)->FindClass(env, "org/professor/jni/Person");
if (NULL == personClass) {
__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND CLASS");
return JNI_FALSE;
}
//2.获取属性ID
jfieldID happinessFiledID = (*env)->GetStaticFieldID(env, personClass, "happiness", "I");
if (NULL == happinessFiledID) {
__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND Happiness FiledID");
return JNI_FALSE;
}
//3.获取静态属性值
jint happinessValue = (*env)->GetStaticIntField(env, personClass, happinessFiledID);
if (NULL != happinessValue) {
__android_log_print(ANDROID_LOG_ERROR, "PERSON happinessValue = %d",
(const char *) happinessValue);
}
//4.设置静态属性值
(*env)->SetStaticIntField(env, personClass, happinessFiledID, 80);
//5.删除本地局部引用表,基本数据类型不需要
(*env)->DeleteLocalRef(env, personClass);
return JNI_TRUE;
}
小结
- 由于JNI 函数是直接操作JVM中的数据结构,不受 Java访问修饰符的限制。即,Native代码中调用 JNI函数可以访问 Java 对象中的非 public 属性和方法
- 访问和修改实例变量操作步聚:
- 调用
GetObjectClass
函数获取实例对象的 Class 引用 - 调用
GetFieldID
函数获取 Class 引用中某个实例变量的 ID - 调用
GetXXXField
函数获取变量的值,需要传入实例变量所属对象和变量 ID - 调用
SetXXXField
函数修改变量的值,需要传入实例变量所属对象、变量 ID 和变量的值
- 调用
- 访问和修改静态变量操作步聚:
- 调用
FindClass
函数获取类的 Class 引用 - 调用
GetStaticFieldID
函数获取 Class 引用中某个静态变量 ID - 调用
GetStaticXXXField
函数获取静态变量的值,需要传入变量所属 Class 的引用和变量 ID - 调用
SetStaticXXXField
函数设置静态变量的值,需要传入变量所属 Class 的引用、变量 ID和变量的值
- 调用

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Go channel实现原理剖析
1. 前言 channel是Golang在语言层面提供的goroutine间的通信方式,比Unix管道更易用也更轻便。channel主要用于进程内各goroutine间通信,如果需要跨进程通信,建议使用分布式系统的方法来解决。 本章从源码角度分析channel的实现机制,实际上这部分源码非常简单易读。 2. chan数据结构 src/runtime/chan.go:hchan定义了channel的数据结构: type hchan struct { qcount uint // 当前队列中剩余元素个数 dataqsiz uint // 环形队列长度,即可以存放的元素个数 buf unsafe.Pointer // 环形队列指针 elemsize uint16 // 每个元素的大小 closed uint32 // 标识关闭状态 elemtype *_type // 元素类型 sendx uint // 队列下标,指示元素写入时存放到队列中的位置 recvx uint // 队列下标,指示元素从队列的该位置读出 recvq waitq // 等待读消息的goroutine队列 sendq ...
-
下一篇
Dubbo (二) ——- 项目结构解析
本文主要说明点 概述 背景 需求 架构 Dubbo源代码项目结构 概述 分享Dubbo 的项目结构,通过本文可以大致了解到Dubbo整个项目的结构 背景 将一个项目进行拆分, 进行分布式架构。 需要解决下面的问题 单一应用架构 网站流量少时单一架构,简化开发。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 垂直应用架构 访问大时单一应用速度过小,需要进行应用拆分。此时,用于加速前端页面开发的Web框架(MVC)是关键。 分布式服务架构 当垂直应用过多,将核心业务独立服务。然后提供给其他项目内部调用。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。 流动计算架构 当服务更多的时候,对流量的控制,服务的限流,熔断等操作。而且还需要管理集群容量,提供集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。 需求 dubbo解决下面几个需求 当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大 服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动 服务的调用量越来越大,服务的容量问题就暴露出来...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器