2013-03-14 18 views
5

Çalışma zamanında yerel kitaplıklar için yeni bir yol eklemek mümkün müdür? (Java'yı java.library.path özelliği ile başlatmak yerine), System.loadLibrary(nativeLibraryName) numaralı telefona nativeLibraryName bulmaya çalışırken bu yolu da içerecektir. Bu mümkün mü yoksa JVM başladıktan sonra bu yollar donuyor mu?Java'da çalışma zamanında yerel kitaplıklar için yeni yollar ekleme

+0

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

cevap

19

Bu küçük hack olmadan bu blog bunu yapmanın 2 yolu sağlamak

(yani ClassLoader sınıfının özel alanları erişim) imkansız gibi.

Kayıt için kısa versiyonu burada.

Seçenek 1: mevcut 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); 
} 
için yeni bir yol ekleyin: tam

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); 
} 

Seçenek 2) yeni bir değer ile java.library.path yerine

+1

gerçekten oldukça hack :) bunu gönderdiğiniz için teşekkürler. Bu hayla olmamalı, muhtemelen güvenlik nedenlerinden dolayı bu yolu değiştirmek zor, emin değil. Bunu yapmaktan kaçınacağım ama var olduğunu bilmek güzel. – Sergio

+0

Belirtilen Field sınıfı: "import java.lang.reflect.Field;" – Troyseph

+0

Java9, "yasa dışı yansıtmalı erişim işlemi" kaydeder. – Stefan

İlgili konular