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没有用处.
正如文档所说,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).