2016-11-11 15 views
1

jclassからjobjectを取得する方法があるのだろうか? JNIEnvのGetObjectClass(オブジェクト)呼び出しからjclassを取得できますが、jclassからそのjobjectを取得する場所を見つけることができません。私の実装では、NewGlobalRef()関数を使用してjclassインスタンスをキャッシュしますが、新しいスレッドでは、MethodIDを調べるためにjobjectが必要です。私が仕事を得る方法はありません。代わりにjobjectをキャッシュしてしまいました。Jclassのjclassからjobjectを取得

答えて

1

クラスとオブジェクトの間に1:1の関係がないため、逆マッピングを行うことはできません。 jclassはタイプを表し、jobjectはインスタンスを表します。

したがって、からjclassを取得することは、「インスタンスの種類を特定する」という意味であるためです。しかし、逆の操作は関係ありません。特定の型のインスタンスが複数存在する場合や、指定されたクラスのインスタンスが存在しない場合もあります。

非スタティックメソッドを呼び出す必要がある場合は、jobjectへの参照を覚えておく必要があります。

+0

私の場合、jclassはjobjectインスタンスへの参照である必要があります。私は最初にjclassをjobjectインスタンスから取得しました。それで、逆のキャストを行うことができるはずだと思いました。 C++のように、CBase由来の* pCBaseと* pCConcreteを持っていれば、pCBase =(CBase *)pCConcreteとpCConcrete =(CConcrete *)pCBaseを行うことができます。 – mdang

+0

私の前のコメントから引き続き。 (私は誤ってエンターキーを押す)。私には分かりにくいのは、非静的メソッド呼び出しを行うには、メソッドIDを取得するためにjclassが必要ですが、メソッド呼び出しを行うためには、私はjobjectをパラメータの1つとして必要とします。アプリがクラッシュするので、私はちょうどどちらかを使うことができませんでした。今、私はjobjectを保持し、常にGetObjectClassを呼び出す必要がありますし、refテーブルが塗りつぶされないようにDeleteLocalRefを呼び出す必要があります。あなたが言うことがJNIの行動であるなら、私はこれに固執しています。 – mdang

+0

jclassは、jobjectインスタンスへの参照ではありません。 jclassはJavaクラス 'Class'のインスタンスです。 C++にはjclass/Classのようなものがあります。最も近いC++のメカニズムはtypeid/type_infoです。これはJNI固有のルールではありません。これは一般的なOOPメカニズムです。非静的メソッドを呼び出すにはインスタンス(jobject)を、静的メソッドを呼び出すには型(jclass)を知る必要があります。 Java(とJNIも同様)は、インスタンス(オブジェクトからのクラス)から型を取得することを可能にしますが、逆のマッピングは(私が推測するどんな言語でも)不可能です。 –

関連する問題