• 締切済み

System.load() と System.loadLibrary() の違いを詳しく教えて!

javaでwebアプリを開発してます。 ※OSはLinux(Turbo10)、webサーバーはtomcat5です。 ※ネイティブメソッド呼び出しのため、シェアードライブラリをロードします。 そこで質問ですが、 System.load("フルパス付きライブラリファイル名")と System.loadLibrary("ライブラリ名")では 何が違うんでしょうか? JDK1.4のjavadocには一応 load→ダイナミックライブラリとしてローカルファイルシステムからロード loadLibrary→システムライブラリをロードします と書かれていますが、これはloadの場合は実行時にのみ参照しに行き、loadLibraryの場合はメモリ上に持つということでしょうか?

みんなの回答

noname#49664
noname#49664
回答No.2

他にレスがつかないみたいなので、簡単に書いておきます。  System.loadとSystem.loadLibraryは、それぞれ内部でRuntime.getRuntime().load/Runtime.getRuntime.loadLibraryを呼び出します。これらのメソッドは内部でそれぞれload0/loadLibrary0を呼び出します。  これらのメソッドは、SecurityManagerのcheckLinkにてセキュリティマネージャのチェックを行った後、ClassLoader.loadLibraryを呼び出しています。両者の違いは、このClassLoader.loadLibraryを呼び出す際、第3引数(isAbsorute)のフラグがtrueかfalseかの違いだけです。この第3引数は絶対パスか否かを示すものです。  ClassLoader.loadLibrary内ではこのフラグによりファイルを絶対パスから読み込むかどうかを処理した後、最終的にClassLoader内のloadLibrary0メソッドを呼び出してロードを行っています。  つまり、最終的にはSystem.loadもSystem.loadLibraryも、どちらもまったく同じClassLoader.loadLibrary0メソッドによりライブラリ読み込み処理がなされているわけです。したがって、両者の間に機能的な違いは全くない、といえます。

oksunis
質問者

お礼

ご回答ありがとうございました。 ご指摘の事項、自力で調査しました。 tomcatをWEBサーバーとして動作するアプリケーションの場合、シェアードオブジェクトに対するロードは一意でなくてはならないので、Cで作られたアプリケーションみたいにホントにダイナミックリンクして、ライブラリを実行時にのみ使用するような書き方が無いものかと思ったのですが、無理でした。 複数のコンテキストに書かれている当該の処理をまとめたクラスをjarにしてtomcat/common/libに配置して解決しました。どうも。

回答No.1

RuntimeクラスのJavaDocには、もう少し詳しく説明されています。 ここのloadLibrary()メソッドの説明に書かれている「通常の方法で取得できる場所」というのは、Linuxでは、LD_LIBRARY_PATHのことを示しています。 load()の方は、この設定に関係なく、フルパスで指定したファイルをロードします。

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Runtime.html#loadLibrary(java.lang.String)