Android NDK开发系列教程4:对类变量进行操作

简介: 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们也可以直接利用jni来访问和处理类的变量,不一定非要通过Java方法来操作Java类变量。

终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~
通常我们也可以直接利用jni来访问和处理类的变量,不一定非要通过Java方法来操作Java类变量。对类变量操作时,类的静态变量和类的实例变量的操作稍微有些不同,下面进行讲解。

对类的静态变量进行操作

类的静态变量属于类,是所有该类实例共享的。操作该变量时,不需要指定具体的实例是哪个。

 jclass clazz;  
    jfieldID fid;  
    jint num;  

    //1.获取类的Class引用  
    clazz = env->FindClass("zqc/com/example/Person");  
    if (clazz == 0) {    // 错误处理  
        return;  
    }  

    //2.获取类静态变量num的属性ID  
    fid = env->GetStaticFieldID( clazz, "num", "I");  
    if (fid == 0) {  
        return;  
    }  

    // 3.获取静态变量num的值  
    num = env->GetStaticIntField(clazz,fid);  
    printf("In C--->ClassField.num = %d\n", num);  

    // 4.修改静态变量num的值  
    env->SetStaticIntField(clazz, fid, 80);  

主要步骤就是代码里面注释的。

对类的实例变量进行操作

代码如下:

    jclass clazz;  
    jfieldID fid;  
    jstring j_str;  
    jstring j_newStr;  
    const char *c_str = NULL;  

    // 1.获取类的Class引用,obj是该类的某个实例jobject obj;
    clazz = env->GetObjectClass(obj);  
    if (clazz == NULL) {  
        return;  
    }  

    // 2. 获取类实例变量str的属性ID  
    fid = env->GetFieldID(clazz,"str", "Ljava/lang/String;");  
    if (clazz == NULL) {  
        return;  
    }  

    // 3. 获取实例变量str的值  
    j_str = (jstring)env->GetObjectField(obj,fid);  

    // 4. 将unicode编码的java字符串转换成C风格字符串  
    c_str = env->GetStringUTFChars(j_str,NULL);  
    if (c_str == NULL) {  
        return;  
    }  
    printf("In C--->ClassField.str = %s\n", c_str);  
    env->ReleaseStringUTFChars(j_str, c_str);  

    // 5. 修改实例变量str的值  
    j_newStr = env->NewStringUTF("This is C String");  
    if (j_newStr == NULL) {  
        return;  
    }  

    env->SetObjectField(obj, fid, j_newStr);  

    // 6.删除局部引用  
    env->DeleteLocalRef(clazz);  
    env->DeleteLocalRef(j_str);  
    env->DeleteLocalRef(j_newStr);  

JNI开发也有JNI开发的套路,按照上面套路来,即可修改类的实例变量。操作过程也很好理解,我们在native操作的时候都需要借助JNI提供的函数获取相应的引用。利用引用去进行操作。由于JNI函数是直接操作JVM中的数据结构,所以即使是private的变量,我们也可以进行修改。

总结

  1. 由于JNI函数是直接操作JVM中的数据结构,不受Java访问修饰符的限制。即,在本地代码中可以调用JNI函数可以访问Java对象中的非public属性和方法

  2. 访问和修改静态变量操作步聚:

    1. 调用FindClass函数获取类的Class引用

    2. 调用GetStaticFieldID函数获取Class引用中某个静态变量ID

    3. 调用GetStaticXXXField函数获取静态变量的值,需要传入变量所属Class的引用和变量ID

    4. 调用SetStaticXXXField函数设置静态变量的值,需要传入变量所属Class的引用、变量ID和变量的值

  3. 访问和修改实例变量操作步聚:

    1. 调用GetObjectClass函数获取实例对象的Class引用

    2. 调用GetFieldID函数获取Class引用中某个实例变量的ID

    3. 调用GetXXXField函数获取变量的值,需要传入实例变量所属对象和变量ID

    4. 调用SetXXXField函数修改变量的值,需要传入实例变量所属对象、变量ID和变量的值

目录
相关文章
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
657 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
558 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
908 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
686 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
4月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
266 0
|
5月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
495 6
|
7月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
521 11
|
11月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
3161 77
|
7月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
331 0
|
8月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
386 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡

热门文章

最新文章