何时使用 CallNonvirtualObjectMethod 及其相关方法
When to use CallNonvirtualObjectMethod and its related methods?
似乎CallStaticObjectMethod
,CallObjectMethodMethod
等......就是你所需要的。根据文档
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。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法