2016-05-13 17 views

Antwort

5

tl; dr

Die Plattform Der Name der abhängigen Bibliothek ist in systemeigenen Methoden der Java Virtual Machine enthalten. Der eigentliche Algorithmus einfach prepends/anhängt eine plattformspezifische Präfix/Suffix an den Namen:

  • Fenster: "hello" ->"hello.dll"
  • Linux/Solaris: "hello""libhello.so"
  • Mac: "hello" ->"libhello.dylib"

Lange Version:

Es gibt ein paar von JDK Java-Methoden, die mit dem Laden von Bibliotheken und/oder Bibliotheksnamen beschäftigen:

java.lang.System.loadLibrary(String name) 
java.lang.System.mapLibraryName(String name) 
java.lang.Runtime.loadLibrary(String name) 
java.lang.ClassLoader.loadLibrary(String name) 

Die berühmten System.loadLibrary eigentlich nennt Runtime.loadLibrary die ClassLoader.loadLibrary nennt. Am Ende die Implementierungen dieser Methoden aufrufen, die folgenden nativen Methoden, die die angegebenen Bibliotheksnamen in den plattformspezifischen Namen übersetzen:

native java.lang.System.mapLibraryName(String name) 
native java.lang.ClassLoader$NativeLibrary.findBuiltinLib(String name) 

Die Implementierungen dieser nativen Methoden können in (Link zu den OpenJDK Versionen finden):

Beide Methoden implementieren den gleichen Algorithmus zum Erstellen des tatsächlichen Bibliotheksnamens, , wobei das Präfix JNI_LIB_PREFIX vorangestellt und das Suffix JNI_LIB_SUFFIX angehängt wird.

Am Ende der Makros JNI_LIB_PREFIX und JNI_LIB_SUFFIX in der Plattform definiert werden, umfassen abhängige Dateien, nämlich

2

Kurze Antwort: ja.

Aus dem Javadoc für loadLibrary: "Lädt die Systembibliothek, die durch das Argument libname angegeben wird. Die Art und Weise, in der ein Bibliotheksname der tatsächlichen Systembibliothek zugeordnet ist, hängt vom System ab." System.mapLibraryName(libname) gibt zurück, was der zugeordnete Bibliotheksname sein wird.

Dies entspricht den allgemeinen Konventionen für Bibliotheksnamen: lib Präfix in Linux und Mac OS X, kein Präfix in Windows plus plattformabhängige Dateierweiterung. Beachten Sie, dass die Erweiterung für JNI-Bibliotheken unter Mac OS X jnilib ist, nicht dylib wie für andere Bibliotheken. Auch diese Zuordnung ist nicht einzigartig für die Java-Laufzeit, gcc ... -lhello wird auch nach libhello.so (oder libhello.dylib unter Mac OS X) suchen.

Wenn Sie nicht über die Laufzeit wollen diese Zuordnung zu tun, würden Sie sich den richtigen Dateinamen einschließlich der Erweiterung bestimmen müssen und übergeben diese an loadLibrary