Java 8 より前の Java バージョンでは、ネイティブ コードを共有ライブラリに配置する必要がありますが、Java 8 では JNI で静的リンク ライブラリを使用できると読みました。例を検索しましたが、見つかりませんでした。
JNI ライブラリを Java アプリケーションに静的にリンクするにはどうすればよいですか?
ベストアンサー1
Java SE 8の仕様は静的リンクをサポートするように変更され、静的リンクはJDKに実装されています。これは、システム.loadライブラリ参照されているJNI仕様のセクションはここそしてここ。
ネイティブ メソッドのシグネチャとデータ型は、静的にリンクされたメソッドと動的にリンクされたメソッドで同じです。ただし、ライブラリを静的にリンクするには、JDK の makefile をハックする必要があるかもしれません。
大きな違いの 1 つは、静的ライブラリの初期化方法です。動的ライブラリは、JNI_OnLoad
関数を呼び出すことによって初期化され、 を呼び出すことによって初期化解除されますJNI_OnUnload
。各動的ライブラリには、これらの関数の独自のバージョンを含めることができます。静的にリンクされたライブラリが複数ある場合、明らかに、それらすべてに同じ名前の関数を含めることはできません。という名前の静的ライブラリの場合、libname
ロード/アンロード関数はJNI_OnLoad_libname
と ですJNI_OnUnload_libname
。
関数は 以上JNI_OnLoad_libname
の値を返す必要がありますJNI_VERSION_1_8
。そうでない場合、JVM は静的ライブラリを無視します。
基本的に、 を呼び出すとSystem.loadLibrary("foo")
、システムは実行中の実行可能イメージ内で関数を検索しJNI_OnLoad_foo
、見つかった場合はライブラリが静的にリンクされていると想定し、実行中のイメージ内でそのネイティブ メソッドを検索します。 が見つからJNI_OnLoad_foo
ない場合は、通常の動的ライブラリの検索と読み込みが行われ、見つかった動的ライブラリからネイティブ メソッドがリンクされます。