何时使用CallNonvirtualObjectMethod及其相关方法?

时间:2015-03-07 04:21:29

标签: java c++ java-native-interface

好像只需要CallStaticObjectMethodCallObjectMethodMethod等等......根据文件

  

CallNonvirtual<type>Method例程系列和Call<type>Method例程系列是不同的。 Call<type>Method例程基于对象的类调用方法,而CallNonvirtual<type>Method例程基于由clazz参数指定的类调用方法,从中获取方法ID。方法ID必须从对象的真实类或其超类之一获得。

从该描述中也可以看出具体方法CallNonvirtualObjectMethod没有用处。

1 个答案:

答案 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)。