17

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

4

2 に答える 2

30

[このソリューションはJava10以降では機能しません]

少しのハッキング(つまり、ClassLoaderクラスのプライベートフィールドへのアクセス)なしでは不可能のようです。

このブログはそれを行う2つの方法を提供します。

ちなみに、こちらがショートバージョンです。

オプション1: java.library.pathを新しい値に完全に置き換えます)

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に新しいパスを追加します

/**
* 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);
}
于 2013-03-14T12:34:30.470 に答える