jni java共享变量_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和变量的值
jni java共享变量_Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量相关推荐
- android jni 结构体_Android应用开发Android JNI-c/c++调用java方法
本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助. " Android JNI-c/c++调用java方法, ...
- jni java共享变量_JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量 .
在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性), ...
- S3C2416裸机开发系列十六_sd卡驱动实现
S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子 1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.数据传输快.可插拔.安全性好等优 ...
- S5PV210开发系列十_Lwip的移植
S5PV210开发系列十 Lwip的移植 象棋小子 1048272975 Internet实现了全球范围内计算机网络的互连,不同主机之间必须遵循相同的网络协议才能彼此通信.TCP/IP协议作为一 ...
- openresty开发系列37--nginx-lua-redis实现访问频率控制
openresty开发系列37--nginx-lua-redis实现访问频率控制 一)需求背景 在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次 在openresty中 ...
- java 继承类 变量、静态变量、构造函数执行顺序
java 继承类 变量.静态变量.构造函数执行顺序 Java代码 class C{ static int prt(int i){ System.out.println(i); return i; ...
- Java中合理使用局部变量替代成员变量、静态变量
故事起因 一个Java类中可以存在多种形式的变量,可以是最一般的成员变量.或静态变量.或临时变量.如下图: public class VariableDemo {static int staticVa ...
- Java非静态变量给静态变量赋值
@Value注解介绍: 作为Spring的一个常用注解,其作用是通过注解将常量.配置文件中的值和其他bean的属性值注入到变量中,作为变量的初始值. @Value("${login.name ...
- Java 成员变量和静态变量的区别
文章目录 Java 成员变量和静态变量的区别 变量声明默认值 与 Python 的联系 实例变量的声明 类变量的声明 static 方法 Java 成员变量和静态变量的区别 1)成员变量所属于对象.所 ...
最新文章
- DEDE 5.7分类联动BUG
- 为什么一个程序申请的内存有限制_为什么要做自己的小程序商城,做一个要多久?...
- SQL 2005 数据库镜像
- setnx是原子操作吗_谈谈Volatile关键字?为什么不能保证原子性?用什么可以替代?为什么?...
- python向服务器请求压缩数据及解压缩数据
- 飞鸽传书计算乘积的聚合函数跑哪去了呢?
- ProjeQtOr(项目管理软件) v9.0.2
- Laravel核心解读--服务容器(IocContainer)
- jQuery具体实例介绍什么时候用ajax,ajax应该在什么地方使用
- SYNwall:零配置物联网防火墙
- 移动端分享链接给微信好友
- 使用 python 实现恩尼格码的加密
- 浅析大数据与人工智能
- 【Linux】VirtualBox设置静态ip
- Docker Engine 安装时遇到的坑
- 前端工程师实习面试总结
- 记一次腾讯TBS浏览服务集成实践
- jQuery实现平年闰年判断
- Python str find方法
- 系统克隆 机械硬盘无缝迁移到ssd
热门文章
- 【jQuery源码】select方法
- javascript对时间的校验操作
- 数据挖掘 —— 模型评估
- Tensorflow基于minist数据集实现自编码器
- python 语言教程(3)变量之数字类型
- 跨链Cosmos(10) IBC接口
- 趣链 BitXHub跨链平台 (7)应用链插件
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
- 深度探索C++ 对象模型(5)-Initialization list(3)
- 判断子序列不同的子序列两个字符串的删除操作编辑距离