好像只需要CallStaticObjectMethod
,CallObjectMethodMethod
等等......根据文件
CallNonvirtual<type>Method
例程系列和Call<type>Method
例程系列是不同的。Call<type>Method
例程基于对象的类调用方法,而CallNonvirtual<type>Method
例程基于由clazz
参数指定的类调用方法,从中获取方法ID。方法ID必须从对象的真实类或其超类之一获得。
从该描述中也可以看出具体方法CallNonvirtualObjectMethod
没有用处。
答案 0 :(得分:6)
正如文档所说,Call<Type>Method
在对象的实际类中调用该方法,而CallNonvirtual<Type>Method
调用您指定的类中的方法。
考虑这个Java代码:
public class A {
public void doSomething() {
System.out.println("A.doSomething " + this.getClass().getName());
}
}
public class B extends A {
public void doSomething() {
System.out.println("B.doSomething " + this.getClass().getName());
}
}
public class Test {
public static native jniTest(B b);
public static void main(String[] args) {
B obj = new B();
jniTest(obj);
}
}
如果jniTest
尝试使用doSomething
为其参数调用CallVoidMethod
,则会打印“B.doSomething B”。如果它使用CallNonvirtualVoidMethod
,则会打印“A.doSomething B”。
这与Java中super.
调用使用的机制相同(invokespecial
字节码);但是,它不限于在当前类的直接超类中调用方法(您不能在Java中执行super.super.something()
或new B().super.doSomething()
,但您可以使用JNI)。