JNI 的 call<>method 与 callNonVirtual<>method
2012-07-05 19:07
260 查看
看一些资料,说 callNonVirtual<>method 是类似于c++里面父类声明的非抽抽象函数,并且有个例子
在如果定义
在C++中如下调用
那么最后的结果是调用的Father类的fun函数。
但是如果 father继承grandfather,那调用callNonVirtual<>method的时候是调用的father的函数还是grandfather的函数呢?
经过试验发现,调用哪个函数,是callNonVirtual<>method的第二个参数决定的。代码就不写了
PS: 顺带说下 FindClass( ) 和 getObjectClass( )的区别,因为在写上面的测试代码的时候我出过这个错
FindClass( ) 就是通过包名类名去找,这个相当于绝对路径吧
getObjectClass( ) 是通过一个obj的类型去找,这个地方需要注意的是,他是通过对象类型去找,不是通过引用类型去找
比如一开始在java 里面写了
那么在C++里面获得这个obj之后,如果用getObjectClass( ) 获得的就是 Child 的 Class , 不是 Father 的 Class
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
相关文章推荐
- java.lang.VerifyError: Bad <init> method call from inside of a branch
- 关于Grails在输入命令出现Regression in verifier for <init> method call from inside of a branch的BUG解决办法
- java.lang.VerifyError: Bad <init> method call from inside of a branch
- Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface androi
- java.lang.NoSuchMethodException: <init> [class android.content.Context, interface androidutil.Attri
- Android ndk“Unresolved inclusion: <jni.h>”
- 报错 :java.lang.NoSuchMethodException: <init>()
- android jni ——Field & Method --> Accessing Field
- <form action="form_action.asp" method="get">
- The method execute(Void[]) is ambiguous for the type new AsyncTask<Void,Void,Void>(){}
- android NDK开发编译C++文件出现Type 'jint' could not be resolved和Unresolved inclusion: <jni.h>的解决办法
- 学习android JNI的那些事儿--------5. Field & Method --> Accessing Mehtod
- android jni ——Field & Method --> Accessing Field
- Uncaught TypeError: Object #<Object> has no method 'addEvents'
- *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value ‘<Student: 0x8399f70>’
- android The method execute(Void[]) is ambiguous for the type new AsyncTask<Void,Void,Void>(){}
- 学习android JNI的那些事儿--------4. Field & Method --> Accessing Field
- Uncaught TypeError: Object #<Object> has no method 'addEvents' ext-all-debug异常
- Jni< 1 >
- Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android