web-dev-qa-db-ja.com

registerNatives()メソッドは何をしますか?

Javaでは、Objectクラスのプライベート静的メソッドregisterNatives()は何をしますか?

66
Hubris

少し紛らわしいのは、前の回答で_Java.lang.Object.registerNatives_に示されているコードが、ネイティブ関数の登録方法のにすぎないことです。これは、(OpenJDKの実装で)クラスObjectのネイティブ関数を登録するコードです。独自のクラスのネイティブ関数を登録するには、独自のライブラリのネイティブコードからJNI関数RegisterNativesを呼び出す必要があります。これは少し循環的に聞こえるかもしれませんが、ループを破るにはいくつかの方法があります。

  1. クラスObjectのこの実装の例に従ってください:

    a。 Javaクラスで、registerNatives(またはその他の名前。それは問題ではありません)という名前のネイティブメソッド(できれば静的)を宣言します。

    b。ネイティブコードで、Java_<your fully qualified class name>_registerNatives_という名前の関数を定義します。これには、JNI関数RegisterNativesへの呼び出しが含まれます。

    c。 Javaコードで、Java registerNativesメソッドが他のネイティブメソッドへの呼び出しの前に呼び出されることを確認してください。

OR

  1. _JNI_OnLoad_を使用します

    a。ネイティブライブラリで関数jint JNI_OnLoad(JavaVM *vm, void *reserved)を定義します。この関数の本体で、JNI関数RegisterNativesを呼び出します。

    b。 Java VMは、ネイティブライブラリが_JNI_OnLoad_によってロードされたときに自動的に_System.loadLibrary_を探して呼び出します。おそらく、クラスの静的初期化子で呼び出します(envポインターが指すテーブルでGetEnv関数を呼び出すことにより、必要なvmポインターを取得します)。

8
Eric