Javaでは、Objectクラスのプライベート静的メソッドregisterNatives()
は何をしますか?
少し紛らわしいのは、前の回答で_Java.lang.Object.registerNatives
_に示されているコードが、ネイティブ関数の登録方法の例にすぎないことです。これは、(OpenJDKの実装で)クラスObjectのネイティブ関数を登録するコードです。独自のクラスのネイティブ関数を登録するには、独自のライブラリのネイティブコードからJNI関数RegisterNatives
を呼び出す必要があります。これは少し循環的に聞こえるかもしれませんが、ループを破るにはいくつかの方法があります。
クラスObjectのこの実装の例に従ってください:
a。 Javaクラスで、registerNatives
(またはその他の名前。それは問題ではありません)という名前のネイティブメソッド(できれば静的)を宣言します。
b。ネイティブコードで、Java_<your fully qualified class name>_registerNatives
_という名前の関数を定義します。これには、JNI関数RegisterNatives
への呼び出しが含まれます。
c。 Javaコードで、Java registerNatives
メソッドが他のネイティブメソッドへの呼び出しの前に呼び出されることを確認してください。
OR
_JNI_OnLoad
_を使用します
a。ネイティブライブラリで関数jint JNI_OnLoad(JavaVM *vm, void *reserved)
を定義します。この関数の本体で、JNI関数RegisterNatives
を呼び出します。
b。 Java VMは、ネイティブライブラリが_JNI_OnLoad
_によってロードされたときに自動的に_System.loadLibrary
_を探して呼び出します。おそらく、クラスの静的初期化子で呼び出します(env
ポインターが指すテーブルでGetEnv
関数を呼び出すことにより、必要なvm
ポインターを取得します)。