文章目录

  • I . 设置 Java 对象 属性 流程
  • II . 查找 Java 对象属性 ( GetFieldID )
  • III . 设置 Java 对象属性 ( SetXxxField )

I . 设置 Java 对象 属性 流程


设置 Java 对象字段流程 :

① 获取属性 ID :

调用 jfieldID GetFieldID(jclass clazz, const char* name, const char* sig) 方法 , 获取对象属性 ID ;

② 根据属性 ID 设置对象属性 :

调用 void SetIntField(jobject obj, jfieldID fieldID, jint value) 方法 , 设置对象属性 ;

II . 查找 Java 对象属性 ( GetFieldID )


1 . 函数原型 : 通过 jclass 对象 , 属性名称名称 , 和 类型签名 , 获取 Java 类对象对应的 属性 ID ;

返回值 : Java 类对象 对应的 属性 ID ( jfieldID 类型变量 )

参数 :

  • jclass clazz : 要获取的 Java 对象方法对应的 Java 类对象 ;
  • const char* name : 属性名称 ;
  • const char* sig : 类型签名 ;
struct _JNIEnv {/* _JNIEnv  结构体中封装了 JNINativeInterface 结构体指针 */const struct JNINativeInterface* functions;...// 最终 调用的 还是 JNINativeInterface 结构体中封装的 GetFieldID 方法jfieldID GetFieldID(jclass clazz, const char* name, const char* sig){ return functions->GetFieldID(this, clazz, name, sig); }...
}

2 . 代码示例 : 获取 Student 类的 getAge 方法 ;

student_class 是 Student 类对应的 C/C++ 中的 jclass 类型变量 ;
“age” 是 属性名称 ;
“I” 是 属性类型签名 ;

extern "C"
JNIEXPORT void JNICALL
Java_kim_hsl_jni_MainActivity_jniObjectTest(JNIEnv *env, jobject instance, jobject student) {...//1 . 获取 Java 对应的 Class 对象jclass student_class = env->GetObjectClass(student);//2 . 获取 Student 的 private int age 属性jfieldID age_field_id = env->GetFieldID(student_class, "age", "I");...
}

涉及到的类型签名可以参考 : https://hanshuliang.blog.csdn.net/article/details/104108556#V__javap_____141

III . 设置 Java 对象属性 ( SetXxxField )


1 . 函数原型 : 通过 Java 对象 , 属性 ID , 和 Java 数据类型属性参数 , 设置对应的 Java 对象属性 ;

返回值 : void

参数 :

  • jobject obj : 要设置属性的 Java 对象 ;
  • jfieldID fieldID : 属性 ID ;
  • jint value : Java 的 int 类型属性值 ;
struct _JNIEnv {/* _JNIEnv  结构体中封装了 JNINativeInterface 结构体指针 */const struct JNINativeInterface* functions;...// 最终 调用的 还是 JNINativeInterface 结构体中封装的 SetIntField 方法void SetIntField(jobject obj, jfieldID fieldID, jint value){ functions->SetIntField(this, obj, fieldID, value); }...
}

2 . 设置方法汇总 :

设置 int 类型属性 , 调用 void SetIntField(jobject obj, jfieldID fieldID, jint value) 方法 ;
设置 boolean 类型属性 , 调用 void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value) 方法 ;

下面是设置 8 种基本数据类型 和 引用类型 , 共 9 中类型应该调用的方法 ;

注意 : 所有设置的类型 , 都是 Java 数据类型 , 如 jobject , jint , jboolean 类型 ;

struct _JNIEnv {/* _JNIEnv  结构体中封装了 JNINativeInterface 结构体指针 */const struct JNINativeInterface* functions;...// 最终 调用的 还是 JNINativeInterface 结构体中封装的 SetXxxField 方法void SetObjectField(jobject obj, jfieldID fieldID, jobject value){ functions->SetObjectField(this, obj, fieldID, value); }void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value){ functions->SetBooleanField(this, obj, fieldID, value); }void SetByteField(jobject obj, jfieldID fieldID, jbyte value){ functions->SetByteField(this, obj, fieldID, value); }void SetCharField(jobject obj, jfieldID fieldID, jchar value){ functions->SetCharField(this, obj, fieldID, value); }void SetShortField(jobject obj, jfieldID fieldID, jshort value){ functions->SetShortField(this, obj, fieldID, value); }void SetIntField(jobject obj, jfieldID fieldID, jint value){ functions->SetIntField(this, obj, fieldID, value); }void SetLongField(jobject obj, jfieldID fieldID, jlong value){ functions->SetLongField(this, obj, fieldID, value); }void SetFloatField(jobject obj, jfieldID fieldID, jfloat value){ functions->SetFloatField(this, obj, fieldID, value); }void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value){ functions->SetDoubleField(this, obj, fieldID, value); }//设置静态属性jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig){ return functions->GetStaticMethodID(this, clazz, name, sig); }...
}

3 . 代码示例 : 获取 Student 类的 getAge 方法 ;

student 是 Student 类对应的 C/C++ 中的 Java 对象 ;
age_field_id 是 属性 ID ;
90 是 属性值 , jint 类型 ;

extern "C"
JNIEXPORT void JNICALL
Java_kim_hsl_jni_MainActivity_jniObjectTest(JNIEnv *env, jobject instance, jobject student) {...//1 . 获取 Java 对应的 Class 对象jclass student_class = env->GetObjectClass(student);//2 . 获取 Student 的 private int age 属性jfieldID age_field_id = env->GetFieldID(student_class, "age", "I");//3 . 设置 Student 的 age 属性值 90env->SetIntField(student, age_field_id, 90);...
}

【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  2. 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )

    文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...

  3. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  4. Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调

    Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...

  5. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  6. Android 高级开发 JNI NDK 介绍与使用

    Android 高级开发 JNI & NDK 介绍与使用 前言 对于没接触过的领域,即是挑战也是机遇,不仅能够提升自己的能力.还能够学习到新的技术知识 而学习新的技术的时候,最好是从头开始按照 ...

  7. OpenCV android sdk配置OpenCV android NDK开发实例

    OpenCV android sdk配置OpenCV android NDK开发实例 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/det ...

  8. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  9. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

最新文章

  1. 写《回国驯火记》的那个安普若
  2. python财务报表分析-需要做财务数据分析,有什么好用的工具?
  3. 云栖发布|企业级互联网架构全新升级 ,助力数字创新
  4. mat opencv java_OpenCV Mat到JavaCV Mat转换
  5. halcon create_ocr_class_svm 使用SVM分类器创建OCR分类器
  6. asp.net mvc 用Redis实现分布式集群共享Session。
  7. TVM:使用Tensor Expression (TE)来处理算子
  8. (91)Verilog HDL系统函数和任务:$fopen
  9. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的在线音乐网站
  10. asp.net ajax 1.0中detailview与updatepanel混合使用的例子
  11. 國外空間亂碼解決方法
  12. python-study-10
  13. java程序编辑器_java实现编辑器(一)
  14. ActiveMQ面试题
  15. Euraka配置instanceid显示ip
  16. 日常百度SEO优化技巧
  17. Windows Server 2012开机账户自动登录
  18. 第四周项目3--单链表应用之逆置
  19. 你该知道的Pyecharts简易上手教程
  20. oracle语句怎么查工作日,SQL查询工作日 - Oracle开发 - ITPUB论坛-中国专业的IT技术社区...

热门文章

  1. 心得体悟帖---开解语录2
  2. psfaddtable - 添加一个Unicode字符表到控制台字体中
  3. 区块链100问1-20问
  4. Collection集合的三种初始化方法
  5. 如何让滚动条出现在左边
  6. 1.网页学习-开始学习第一步:
  7. 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
  8. 算法学习:后缀自动机
  9. python-jsonrpc框架实现JsonRPC协议的web服务
  10. The Maximum Unreachable Node Set