在 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()会被正常调用么?

解决方案 »

  1.   

    JNI层调用java需要一个jclass对象,如果你是jclass clazz = env->FindClass("你的包名/A");
    然后通过GetMethodID得到abstractF方法的jmethodID,再传递一个对应于类B的jobject对象去调用,是可以调用到B的abstractF方法的.我曾经通过java.util.List调用过其中一个实现:ArrayList的add方法
      

  2.   

    很感谢楼上的回复。
    不过我需要的是在编写JNI实现(C++),并不知道B类的存在。你可能没仔细看题目。不过你说的很有意义,但是我需要要确定一点,既然是抽象方法,我override之后的子类也会被调用么?
      

  3.   

    jni层调用java层就和java层本身调用java层一样:
    1.需要得到该类的一个实际对象去调用
    2.需要得到方法的信息
    3.需要传递给方法它所需的参数对于你这里的问题,那我要问你了:你传递一个什么样的对象来调用这个abstractF方法?传递某个子类就调用该子类的abstractF方法喽
      

  4.   

    传递的当然是抽象类的实例。我需要实现这样的需求,就是在JNI里调用的方法,是多态的。class A {
      abstractF(); 
    }比如 B extends A {
      abstractF();
    }A b = new B();我需要在C++层调用b实例的abstractF方法。
      

  5.   

    传递的当然是抽象类的实例。我需要实现这样的需求,就是在JNI里调用的方法,是多态的。class A {
      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层呢?
      

  6.   

    1.答:可以.
    2.答:jni层可以不变,只要是针对抽象编程(针对抽象类A的引用来编程),以后不论增加多少个A的派生类,只要传递给派生类的实例去调用,就可以调用到具体派生类的方法
      

  7.   

    系统的MediaPlayer的JNI代码在哪里,我想看看。这个就做到了。