在 C++中调用的的Java函数f,可以在so文件生成后,再改写实现么。
或者说,这个函数f可以调用抽象方法么?
代码如下:
abstract class A {
native void callF();/* we call f() in this implementation. */ void f() {
abstractF();
} abstract void abstractF();
}class B extends A {
void abstractF() { ... }
}// calling codes:
A a = new B();
a.callF();以上可以正常运行么? 就是 B的abstractF()会被正常调用么?
或者说,这个函数f可以调用抽象方法么?
代码如下:
abstract class A {
native void callF();/* we call f() in this implementation. */ void f() {
abstractF();
} abstract void abstractF();
}class B extends A {
void abstractF() { ... }
}// calling codes:
A a = new B();
a.callF();以上可以正常运行么? 就是 B的abstractF()会被正常调用么?
然后通过GetMethodID得到abstractF方法的jmethodID,再传递一个对应于类B的jobject对象去调用,是可以调用到B的abstractF方法的.我曾经通过java.util.List调用过其中一个实现:ArrayList的add方法
不过我需要的是在编写JNI实现(C++),并不知道B类的存在。你可能没仔细看题目。不过你说的很有意义,但是我需要要确定一点,既然是抽象方法,我override之后的子类也会被调用么?
1.需要得到该类的一个实际对象去调用
2.需要得到方法的信息
3.需要传递给方法它所需的参数对于你这里的问题,那我要问你了:你传递一个什么样的对象来调用这个abstractF方法?传递某个子类就调用该子类的abstractF方法喽
abstractF();
}比如 B extends A {
abstractF();
}A b = new B();我需要在C++层调用b实例的abstractF方法。
abstractF();
}比如 B1 extends A {
abstractF() {
System.out.print("B1");
}
}B2 extends A {
abstractF() {
System.out.print("B2");
}
}A b1 = new B1();
A b2 = new B2();问: 可以在调用 b1.callF()后打印出B1, 在调用b2.callF()后打印出B2么?
在JNI不变的前提下,我会动态增加A的派生类,B3, B4, B5...,
是不是需要把类名B1, B2, B3, B4, B5传递到JNI层呢?
2.答:jni层可以不变,只要是针对抽象编程(针对抽象类A的引用来编程),以后不论增加多少个A的派生类,只要传递给派生类的实例去调用,就可以调用到具体派生类的方法