Czy w środowisku wykonawczym można dodać nową ścieżkę dla bibliotek natywnych? (Zamiast uruchamiania Java z właściwością java.library.path), więc wywołanie System.loadLibrary(nativeLibraryName)
będzie zawierało tę ścieżkę podczas próby znalezienia nativeLibraryName
. Czy to możliwe, czy te ścieżki zostały zamrożone po uruchomieniu JVM?Dodawanie nowych ścieżek dla bibliotek natywnych w środowisku wykonawczym w języku Java
Odpowiedz
Wydaje się niemożliwe bez małej hacking (czyli dostępu do prywatnych pól klasy ClassLoader)
Ten blog dostarczyć 2 sposoby to zrobić.
Dla przypomnienia, oto krótka wersja.
Wariant 1: w pełni zastąpić java.library.path z nowej wartości)
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);
}
Opcja 2: dodać nową ścieżkę do bieżącego 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);
}
Rzeczywiście dość hack :) dzięki za umieszczenie go. To nie powinno być tak hacky, prawdopodobnie trudno jest zmienić tę ścieżkę ze względów bezpieczeństwa, nie jestem pewien. Będę tego unikać, ale miło jest wiedzieć, że istnieje. – Sergio
Wymieniona klasa Field to: 'import java.lang.reflect.Field;' – Troyseph
Java9 rejestruje "nielegalną operację dostępu odblaskowego". – Stefan
- 1. Dodawanie adnotacji Java w środowisku wykonawczym
- 2. Ładowanie bibliotek DLL w środowisku wykonawczym w języku C#
- 3. Dodawanie obrazu w środowisku wykonawczym
- 4. Skompiluj klasę Groovy w środowisku wykonawczym w języku Java
- 5. Dodawanie klas jednostek dynamicznie w środowisku wykonawczym
- 6. Załaduj kod bajtów Java w środowisku wykonawczym
- 7. Java: Rozszerzanie klasy w środowisku wykonawczym
- 8. Wypełnij/zaktualizuj wartości wyliczeniowe w środowisku wykonawczym w języku C#
- 9. Dynamiczne dodawanie konfiguracji kontekstu sprężyn w środowisku wykonawczym?
- 10. Jak dodać nowe metadane idp wiosną SAML w środowisku wykonawczym
- 11. Android - Zmień układ fragmentów w środowisku wykonawczym
- 12. Tworzenie tabel dynamicznie w środowisku wykonawczym
- 13. włączyć HeapDumpOnOutOfMemoryError w środowisku wykonawczym
- 14. Konfiguracja hibernacji w środowisku wykonawczym
- 15. Rozmiar obiektu w środowisku wykonawczym
- 16. Wywoływanie metody o nazwie "ciąg" w środowisku wykonawczym w języku Java i C
- 17. Wyjątki w środowisku wykonawczym dziennika w języku Java przy użyciu log4j
- 18. Załaduj Java Keystore podczas pracy w środowisku wykonawczym
- 19. Architektura wtyczek do załadowania w środowisku wykonawczym
- 20. Znajdź zależne pakiety w środowisku Eclipse w środowisku wykonawczym
- 21. NoClassDefFoundError w środowisku wykonawczym z Gradle
- 22. Wykryj przyspieszenie sprzętowe w środowisku wykonawczym: Android
- 23. Sprawdzanie wersji modułu Python w środowisku wykonawczym
- 24. Uzyskiwanie danych wyjściowych procesu w środowisku wykonawczym
- 25. Jak mogę dodać właściwości do obiektu w środowisku wykonawczym?
- 26. Pobieranie podpisu apk w środowisku wykonawczym dla Androida
- 27. Android/Crashlytics NoClassDefFoundError dla com.crashlytics.android.beta.Beta w środowisku wykonawczym
- 28. jak utworzyć klasę dynamiczną w środowisku wykonawczym w Javie
- 29. Uzyskiwanie tożsamości podpisywania kodu w środowisku wykonawczym?
- 30. Jak konwertować typy w środowisku wykonawczym?
http://stackoverflow.com/questions/2899804/setting-classpath-during-runt –