Jniでのマルチステートの使用


次の2つのクラスがあるとします.
   1: public class Foo {
   2:  
   3: }
   4:  
   5: public class Bar extends Foo {
   6:     public void Print() {
   7:         System.out.println("Bar::Print().");
   8:     }
   9: }

      また、次の方法があります.
   1: public Foo Current() {
   2:     return (Foo) new Bar();
   3: }

      Javaでは、Currentが返すオブジェクトをBarオブジェクトとして使用するには、次のようにする必要があります.
   1: Foo foo = Current();
   2: ((Bar) foo).Print();

      Jniであれば、この呼び出しをどのように実現すればいいのでしょうか.試験を経て、以下のように呼び出せばよい.
   1: midCurrent = (*env)->GetMethodID(env, clsTestPoly, "Current", "()LTestPolymorphism/Foo;");
   2: FAILED_RETURN(midCurrent);
   3:  
   4: objFoo = (*env)->CallObjectMethod(env, objmTestPoly, midCurrent);
   5: FAILED_RETURN(objFoo);
   6:  
   7: clsBar = (*env)->FindClass(env, "TestPolymorphism/Bar");
   8: FAILED_RETURN(clsBar);
   9:  
  10: midPrint = (*env)->GetMethodID(env, clsBar, "Print", "()V");
  11: FAILED_RETURN(midPrint);
  12:  
  13: (*env)->CallObjectMethod(env, objFoo, midPrint);

      1行目はCurrent関数のid番号を取得するために使用されます.
      4行目はCurrentを呼び出してFooオブジェクト(実際にはBarオブジェクト)を取得するために使用されます.
      7行目はBarクラスのエンティティを取得するために使用されます.
      10行目はBarオブジェクトを取得するためのPrintメソッドです.
      13行目はFooオブジェクト(実際にはBarオブジェクト)を呼び出すためのPrintメソッドであり,上記と一致した使い方を実現している.