【详解】JNI (Java Native Interface) (三)
案例三:C代码访问Java对象的实例变量
获取对象的实例变量的步骤:
1. 通过GetObjectClass()方法获得此对象的类引用
2. 通过类引用的GetFieldID()方法获得实例变量的Field ID.
你需要提供 变量名,字段类型描述符
-
- 对于Java 类, 字段描述符格式为 "L<类全称>;" 类全称中,点"."用 "/"代替。例如,String 的描述符为"Ljava/lang/String;"
注意:这里不要漏了分号";"
-
- 对于基本类型,则有固定标识。注:这里不需要分号。
int => "I" ,byte => "B",short => "S",long => "J",float => "F",double => "D",char => "C",boolean => "Z"
-
- 对于数组,则结合以上类型描述符,加上前缀"[",
如Object数组,用"[L/java/lang/Object;"表示
int数组,用"[I"表示
3. 基于FieldID,通过GetObjectField()方法或Get<基本类型>Field()方法获取实例变量。
4. 如果需要更新实例变量,可以使用SetObjectField()或Set<基本类型>Field()函数进行
以下是JNI用于获取实例变量的函数:(来自于头文件jni.h)
此案例所有文件:
(1)创建Java程序
定义两个实例变量,一个为基本类型,另一个为对象类型。利用C代码对其进行更改,然后输出结果,校验其实例变量是否改变。
(2)编译Java程序,并生成相关头文件
(3)编写源文件实现。
根据上述描述的获取成员变量的步骤进行。
注:由于String在c语言中没有直接映射的类型,只能通过相关函数转换为以'\0'结尾的字符数组。
(4)生成动态链接库,注这里直接指定库名为libdemo3.so,至于为何要加前缀lib,请看前文
(5)执行Java程序
由图可知,C代码成功改变了Java对象实例变量的值。
- JNI (Java Native Interface)(一)
- JNI (Java Native Interface)(二)
- JNI (Java Native Interface)(三)
- JNI (Java Native Interface)(四)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库