MethodID和FieldID

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


对于C/C++代码中参数类型的解释,请参考文章:http://blog.csdn.net/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,但是不要多次调用构造方法。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值