JNI 的 call<>method 与 callNonVirtual<>method

    看一些资料,说 callNonVirtual<>method 是类似于c++里面父类声明的非抽抽象函数,并且有个例子

public class Father {

	@Override
	public void fun() {
		// TODO Auto-generated method stub
		Log.d("333", "Father involked");
	}

}
public class Child extends Father{
	@Override
	public void fun() {
		// TODO Auto-generated method stub
		Log.d("333", "Child involked");
	}
}


在如果定义

Father instance = new Child();

在C++中如下调用

jobject fObj = env->GetObjectField(obj,fID);
jclass fclass=env->FindClass("lc/test/jni/Father");
jmethodID fm= env->GetMethodID(fclass,"fun","()V");
env->CallNonvirtualVoidMethod(fObj,fclass,fm);


那么最后的结果是调用的Father类的fun函数。


但是如果 father继承grandfather,那调用callNonVirtual<>method的时候是调用的father的函数还是grandfather的函数呢?


经过试验发现,调用哪个函数,是callNonVirtual<>method的第二个参数决定的。代码就不写了




PS: 顺带说下 FindClass( ) 和 getObjectClass( )的区别,因为在写上面的测试代码的时候我出过这个错

FindClass( ) 就是通过包名类名去找,这个相当于绝对路径吧

getObjectClass( ) 是通过一个obj的类型去找,这个地方需要注意的是,他是通过对象类型去找,不是通过引用类型去找

比如一开始在java 里面写了

Father p=new Child();

那么在C++里面获得这个obj之后,如果用getObjectClass( ) 获得的就是 Child 的 Class , 不是 Father 的 Class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值