2013-03-14 18 views
5

実行時にネイティブライブラリの新しいパスを追加することは可能ですか? (Javaをプロパティjava.library.pathで起動する代わりに)System.loadLibrary(nativeLibraryName)を呼び出すと、nativeLibraryNameを検索しようとするとそのパスが含まれます。 JVMの起動後にこれらのパスをフリーズできますか?実行時にネイティブライブラリの新しいパスをJavaで追加する

+0

http://stackoverflow.com/questions/2899804/setting-classpath-during-runtime –

答えて

19

それは少しハッキングなしには不可能と思われる(すなわち、ClassLoaderクラスのプライベートフィールドにアクセス)

これblogはそれを行うための2つの方法を提供します。

記録のために、ここに短いバージョンがあります。

オプション1:現在java.library.pathに

/** 
* Adds the specified path to the java library path 
* 
* @param pathToAdd the path to add 
* @throws Exception 
*/ 
public static void addLibraryPath(String pathToAdd) throws Exception{ 
    final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths"); 
    usrPathsField.setAccessible(true); 

    //get array of paths 
    final String[] paths = (String[])usrPathsField.get(null); 

    //check if the path to add is already present 
    for(String path : paths) { 
     if(path.equals(pathToAdd)) { 
      return; 
     } 
    } 

    //add the new path 
    final String[] newPaths = Arrays.copyOf(paths, paths.length + 1); 
    newPaths[newPaths.length-1] = pathToAdd; 
    usrPathsField.set(null, newPaths); 
} 
に新たなパスを追加:は完全

public static void setLibraryPath(String path) throws Exception { 
    System.setProperty("java.library.path", path); 

    //set sys_paths to null so that java.library.path will be reevalueted next time it is needed 
    final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths"); 
    sysPathsField.setAccessible(true); 
    sysPathsField.set(null, null); 
} 

オプション2)は新しい値でjava.library.pathにを置き換えます

+1

確かにかなりのハック:)それを投稿していただきありがとうございます。それは、ハッキーではないはずですが、確かにセキュリティ上の理由からそのパスを変更するのはおそらく困難です。私はこれをするのを避けるが、それが存在することを知っていいです。 – Sergio

+0

上記のFieldクラスは次のとおりです: 'import java.lang.reflect.Field;' – Troyseph

+0

Java9は「不正なアクセスの操作」を記録します。 – Stefan

関連する問題