MethodID和FieldID

本文详细介绍了如何使用JNI(Java Native Interface)从C/C++代码访问Java中的非静态成员变量、静态成员变量、非静态方法、静态方法等,并展示了如何调用父类方法及构造方法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明本文出自文韬_武略的博客(http://blog.youkuaiyun.com/fwt336/article/details/60761277),请尊重他人的辛勤劳动成果,谢谢!


对于C/C++代码中参数类型的解释,请参考文章:http://blog.youkuaiyun.com/fwt336/article/details/59540356


1.访问非静态成员变量


java代码:



c代码:




结果:

In C:

c.s = "abc"

In Java:

c.s = "123"

主要通过这个方法来获取成员变量:

//获取Object类引用

jclass cls = (*env)->GetObjectClass(env, obj);

//获取MethodID

fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");

//获取变量
jstr = (*env)->GetObjectField(env, obj, fid);
//设置变量

(*env)->SetObjectField(env, obj, fid, jstr);


2.访问静态成员变量


Java代码:

C代码:


打印结果:


与获取非静态方法不同的是,这里的GetStaticFieldID方法,添加了一个static关键字,而在获取具体的变量是GetStaticIntField,也添加了static关键字,还指明了具体的类型int。而它的set方法与get方法也类似。


3.访问非静态方法


Java代码:

C代码:


打印结果:

In C
In Java


代码很简单,直接调用GetMethodID方法获取到MethodId,然后调用Call<Type>Method方法即可。


4.访问静态方法


Java代码:



C代码:



与调用非静态方法很相似,只是多了个static而已。


5.调用父类的方法


通过CallNonvirtual<Type>Method 方法,可以调用被重写了的父类的方法。通过是通过GetMethodID或者GetStaticMethodID来获取MedthodID。但是使用的类名确是superclass

6.调用构造方法


与调用非静态方法类似,需要通过调用构造方法的methodId来获取,方法名是"<init>"返回类型V。
下面看下String类String(char[])的构造方法:


方法都比较好理解,我们发现通过NewObject可以实例化Object:
result = (*env)->NewObject(env, stringClass, cid, elemArr);

当然下面这个方法可以取代上面的方法:


通过AllocObject方法可以创建一个未初始化的类,然后必须通过构造方法来初始化该Object,但是不要多次调用构造方法。




2025-08-04 00:22:09,285 ERROR com.cloudstore.dev.api.service.SessionFilter - 超时拦截:/api/msgcenter/homepage/getPopList,当前sessionId:aaaPj_dz0lX1r5sMiXxGz,hasCookie:true 2025-08-04 00:22:09,296 ERROR com.cloudstore.dev.api.service.SessionFilter - 超时拦截:/api/msgcenter/homepage/getMsgCount,当前sessionId:aaaPj_dz0lX1r5sMiXxGz,hasCookie:true 2025-08-04 00:22:28,293 INFO A2 - [null] pool-10-thread-1-198[weaver.formmode.excel.ModeCacheManagerThread:19] - ModeCacheManagerThread 定时任务刷新浏览框 2025-08-04 00:22:28,297 INFO A2 - [null] pool-10-thread-1-198[weaver.conn.SqlParserUtil:1043] - -----1037-----tableFieldList:{workflow_billfield=[fielddbtype]} 2025-08-04 00:22:28,366 INFO A2 - [null] pool-10-thread-1-198[weaver.conn.SqlParserUtil:1043] - -----1037-----tableFieldList:{mode_custombrowserdspfield=[fieldid], mode_browser=[customid]} 2025-08-04 00:22:28,376 INFO A2 - [null] pool-10-thread-1-198[weaver.conn.SqlParserUtil:1043] - -----1037-----tableFieldList:{mode_custombrowserdspfield=[fieldid], mode_browser=[customid]} 2025-08-04 00:22:28,384 INFO A2 - [null] pool-10-thread-1-198[weaver.conn.SqlParserUtil:1043] - -----1037-----tableFieldList:{mode_custombrowserdspfield=[fieldid], mode_browser=[customid]} 2025-08-04 00:22:28,390 INFO A2 - [null] pool-10-thread-1-198[weaver.conn.SqlParserUtil:1043] - -----1037-----tableFieldList:{mode_custombrowserdspfield=[fieldid], mode_browser=[customid]} 2025-08-04 00:22:30,011 INFO A2 - [null] DefaultQuartzScheduler_Worker-37-245[weaver.conn.RecordSet:1395] - INSERT INTO ScheduleRunLog这是什么错误
最新发布
08-05
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文韬_武略

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值