何时使用 CallNonvirtualObjectMethod 及其相关方法

When to use CallNonvirtualObjectMethod and its related methods?

本文关键字:方法 CallNonvirtualObjectMethod 何时使      更新时间:2023-10-16

似乎CallStaticObjectMethodCallObjectMethodMethod等......就是你所需要的。根据文档

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

从该描述中,听起来CallNonvirtualObjectMethod的特定方法也没有用。

如文档所述,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尝试使用CallVoidMethod调用其参数doSomething,它将打印"B.doSomething B"。如果它使用CallNonvirtualVoidMethod,它将打印"A.doSomething B"。

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