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

ove*_*tic 1 c++ java java-native-interface

看起来CallStaticObjectMethod,CallObjectMethodMethod和等...都是你所需要的.根据文件

CallNonvirtual<type>Method惯例的Call<type>Method家庭和惯例的家庭是不同的.Call<type>Method例程根据对象的类CallNonvirtual<type>Method调用方法,而例程根据clazz参数指定的类调用方法,从中获取方法ID.方法ID必须从对象的真实类或其超类之一获得.

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

use*_*751 7

正如文档所说,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果jniTest尝试doSomething使用CallVoidMethod它来调用其参数,它将打印"B.doSomething B".如果使用CallNonvirtualVoidMethod,它将打印"A.doSomething B".

这与super.Java中的调用使用的机制相同(通过invokespecial字节码); 然而,它并不局限于调用当前类的直接超类的方法(你不能做super.super.something()new B().super.doSomething()在Java中,但您可以用JNI).