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 实例变量和静态变量相关推荐

  1. android jni 结构体_Android应用开发Android JNI-c/c++调用java方法

    本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助. " Android   JNI-c/c++调用java方法, ...

  2. jni java共享变量_JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量 .

    在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性), ...

  3. S3C2416裸机开发系列十六_sd卡驱动实现

    S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子    1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.数据传输快.可插拔.安全性好等优 ...

  4. S5PV210开发系列十_Lwip的移植

    S5PV210开发系列十 Lwip的移植 象棋小子    1048272975 Internet实现了全球范围内计算机网络的互连,不同主机之间必须遵循相同的网络协议才能彼此通信.TCP/IP协议作为一 ...

  5. openresty开发系列37--nginx-lua-redis实现访问频率控制

    openresty开发系列37--nginx-lua-redis实现访问频率控制 一)需求背景 在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次 在openresty中 ...

  6. java 继承类 变量、静态变量、构造函数执行顺序

    java 继承类 变量.静态变量.构造函数执行顺序 Java代码   class C{ static int prt(int i){ System.out.println(i); return i; ...

  7. Java中合理使用局部变量替代成员变量、静态变量

    故事起因 一个Java类中可以存在多种形式的变量,可以是最一般的成员变量.或静态变量.或临时变量.如下图: public class VariableDemo {static int staticVa ...

  8. Java非静态变量给静态变量赋值

    @Value注解介绍: 作为Spring的一个常用注解,其作用是通过注解将常量.配置文件中的值和其他bean的属性值注入到变量中,作为变量的初始值. @Value("${login.name ...

  9. Java 成员变量和静态变量的区别

    文章目录 Java 成员变量和静态变量的区别 变量声明默认值 与 Python 的联系 实例变量的声明 类变量的声明 static 方法 Java 成员变量和静态变量的区别 1)成员变量所属于对象.所 ...

最新文章

  1. DEDE 5.7分类联动BUG
  2. 为什么一个程序申请的内存有限制_为什么要做自己的小程序商城,做一个要多久?...
  3. SQL 2005 数据库镜像
  4. setnx是原子操作吗_谈谈Volatile关键字?为什么不能保证原子性?用什么可以替代?为什么?...
  5. python向服务器请求压缩数据及解压缩数据
  6. 飞鸽传书计算乘积的聚合函数跑哪去了呢?
  7. ProjeQtOr(项目管理软件) v9.0.2
  8. Laravel核心解读--服务容器(IocContainer)
  9. jQuery具体实例介绍什么时候用ajax,ajax应该在什么地方使用
  10. SYNwall:零配置物联网防火墙
  11. 移动端分享链接给微信好友
  12. 使用 python 实现恩尼格码的加密
  13. 浅析大数据与人工智能
  14. 【Linux】VirtualBox设置静态ip
  15. Docker Engine 安装时遇到的坑
  16. 前端工程师实习面试总结
  17. 记一次腾讯TBS浏览服务集成实践
  18. jQuery实现平年闰年判断
  19. Python str find方法
  20. 系统克隆 机械硬盘无缝迁移到ssd

热门文章

  1. 【jQuery源码】select方法
  2. javascript对时间的校验操作
  3. 数据挖掘 —— 模型评估
  4. Tensorflow基于minist数据集实现自编码器
  5. python 语言教程(3)变量之数字类型
  6. 跨链Cosmos(10) IBC接口
  7. 趣链 BitXHub跨链平台 (7)应用链插件
  8. C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
  9. 深度探索C++ 对象模型(5)-Initialization list(3)
  10. 判断子序列不同的子序列两个字符串的删除操作编辑距离