1

クラスのインスタンスが以前にインスタンス化されている場合にのみ、FindClass は成功しますか?

もしそうなら、クラスの使い捨てインスタンスをインスタンス化して、その後の FindClass の呼び出しが成功するようにする最もコストの低い方法は何ですか?

または、インスタンス化されていないクラスで動作する別の JNI メソッドはありますか?

(私の場合、検索しようとしているクラスには静的メソッドしかありません。ネイティブ コードでこれらの Java クラスの静的メソッドのいずれかを呼び出せるようにしたいと考えています。)

-アラン

4

1 に答える 1

1

クラスのインスタンスが以前にインスタンス化されている場合にのみ、FindClass は成功しますか?

いいえ。アプリケーションのクラスローダーが認識しているすべてのクラスが検索されます。インスタンス化されているかどうか。

静的メソッドのみが呼び出され、静的クラス メンバーが使用されている限り、インスタンスは作成されません。Java は、インスタンスの作成が非常に面倒です。静的初期化ブロックが予想よりも遅く実行されても、静的初期化ブロックを取得して、クラスをロードせずに Java で実行するを参照してください。

CallStatic<type>MethodJNI のドキュメントを注意深く読むと、 family がjclassパラメーターとしてCall<type>Method取るのに対し、 を受け取ることがわかりますjobject。この違いがすべてを説明していると思います。

最後に、Java には「使い捨てインスタンス」のようなものはありません。おそらく、スタック上に作成された C++ スタイルのスコープ付きインスタンスについて考えるでしょう。Java にそのように命令することはできません。すべてがヒープに動的に割り当てられ、スコープはガベージ コレクションの参照カウントとスケジューリングによって決定されます。

于 2012-09-28T13:54:22.660 に答える