Gibt es eine plattformunabhängige Java-Anweisung zum Laden einer nativen Bibliothek aus einem anderen Verzeichnis als der Java-Quellcode? Ich möchte so etwas wie diese verwenden:portable-Anweisung zum Laden der JNI-Bibliothek aus einem anderen Verzeichnis unter Verwendung des relativen Pfadnamens?
public class HelloWorld {
static {
System.loadLibrary("../some_project/HelloWorld");
}
public static native void print();
}
Das Problem ist, dass System.loadLibrary() nicht Verzeichnis-Separatoren im Pfadnamen Argument nicht unterstützt. Außerdem benötigt System.load() leider einen absoluten Pfadnamen, was nicht nur bedeutet, dass ich kein relatives Verzeichnis wie oben angegeben angeben kann (was ich gerne tun würde), sondern es erfordert auch, dass das Argument zum Beispiel das Vorhergehende enthält "lib" und ".so" Erweiterung für den JNI-Bibliotheksnamen auf einem Linux-System.
Gibt es einen Standard-Umgang damit? Wenn möglich, möchte ich vermeiden, eine Menge plattformabhängigen Java-Code zu schreiben, nur um den korrekten JNI-Bibliotheksnamen zu erstellen.
Wäre es nicht stabiler, wenn der Pfad relativ zu z.B. Ihre .jar-Datei und nicht das "aktuelle Verzeichnis". Das wird auf lange Sicht zu Problemen führen, wenn das aktuelle Verzeichnis etwas anderes ist (z. B. wegen einer Verknüpfung auf dem Desktop) –
Das ist ein guter Punkt, danke, dass Sie darauf hingewiesen haben. Ich weiß nicht, wie man einen Pfad relativ zu einer .jar-Datei verwendet, aber um eine zweite Frage in einem Kommentar zu vermeiden, verlinke ich einfach auf einige andere stackoverflow-Fragen, die hilfreich zu sein scheinen: http: // stackoverflow .com/questions/2837263/how-do-ich-bekomme-das-Verzeichnis-das-gerade-ausführende-jar-file-is-in http://StackOverflow.com/Questions/5053150/how- to-know-jar-file-verzeichnis http://stackoverflow.com/questions/779650/where-on-the-file-system-was-my-java-class-loaded-from –
Die erste Frage (die Eine, die 'getProtectionDomain()' verwendet, ist die einzig richtige Antwort auf dieses Problem. –