Jniでのマルチステートの使用
次の2つのクラスがあるとします.
また、次の方法があります.
Javaでは、Currentが返すオブジェクトをBarオブジェクトとして使用するには、次のようにする必要があります.
Jniであれば、この呼び出しをどのように実現すればいいのでしょうか.試験を経て、以下のように呼び出せばよい.
1行目はCurrent関数のid番号を取得するために使用されます.
4行目はCurrentを呼び出してFooオブジェクト(実際にはBarオブジェクト)を取得するために使用されます.
7行目はBarクラスのエンティティを取得するために使用されます.
10行目はBarオブジェクトを取得するためのPrintメソッドです.
13行目はFooオブジェクト(実際にはBarオブジェクト)を呼び出すためのPrintメソッドであり,上記と一致した使い方を実現している.
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メソッドであり,上記と一致した使い方を実現している.