2017-08-16 3 views
1

Ich brauche eine Möglichkeit, Bibliothek innerhalb einer JAR-Datei zu laden, ohne es zu extrahieren. Gibt es eine Weise, die ich eine Methode, wie getClass verwenden kann() getResourceAsStream („xxx“)Native Bibliothek dynamisch laden

Struktur sieht wie folgt aus:.

myjar.jar 
- lib/ 
    - <somelib>.<libext> 
- <package> 
    - Foo.class 

Wo die Foo.class wird die Klasse, die Lasten sein und eine Verbindung zum native Bibliothek und das Verfahren sollten auch funktionieren, wenn die lib-Ordner innerhalb der <package>

Antwort

0

Nein, keine Möglichkeit, Bibliothek zu laden aus dem Innern einer jAR-Datei ist es ist, ohne es zuerst zu Extrahieren, müssen Sie die Bibliothek zumindest extrahieren in tmp Ordner um ab zu sein le es zu laden zB mit:

System.load("path/to/libAbc.so")

Es ist nicht möglich, in Java ist die Bibliothek aus dem Speicher oder Zip-Datei zu laden. Die Methode, die die Bibliothek lädt, ist native void ClassLoader.NativeLibrary.load(String name), auch die name der Bibliothek wird intern von der java.lang.ClassLoader verwendet, um die Spur geladener Bibliotheken zu behalten, so dass Sie derzeit nichts anderes als eine echte Datei verwenden können, um als native Bibliothek geladen zu werden würde nicht zum aktuellen Mechanismus passen.

Da das Laden der nativen Bibliothek mit Hilfe von nativen Code getan wird, hängt die Antwort, wenn es eine Möglichkeit ist die native Bibliothek in einem C-Code zu laden: dlopen from memory?

Theoretisch kann es erfolgen , aber weil es plattformspezifisch ist und viele Aspekte berücksichtigt und gelöst werden muss, ist es in Java nicht implementiert und es ist auch kein Standard und/oder einfache Sache in C.

Derzeit in Java, gibt es keine Möglichkeit, dies zu tun, könnte dies ändern, wenn jemand eine solche native Bibliothek erstellen wird, die das tun wird, aber für den Moment kenne ich keine solche Bibliothek.

+0

Sollte nicht der Fall sein, da es jede Datei im Jar lesen kann und die lib ist immer noch eine Datei und System.LoadLibrary() wird immer noch die Datei im Pfad lesen. Sollte es also keine Möglichkeit geben, den gesamten Inhalt direkt im Speicher zu senden und es aus diesem Speicher zu lesen? –

+0

@Android_Dev * Sollte nicht der Fall sein, da es jede Datei im Jar lesen kann und die lib ist immer noch eine Datei und System.LoadLibrary() wird immer noch die Datei im Pfad lesen. Sollte es also keine Möglichkeit geben, den vollen Inhalt direkt in den Speicher zu schicken und er liest aus dieser Erinnerung? * Warum würdest du das denken? Das Laden einer * nativen Bibliothek * erfolgt über das Betriebssystem, nicht über die JVM. –

+0

@AndrewHenle Ja Ich weiß, dass es vom Betriebssystem geladen werden muss, aber das Betriebssystem kümmert sich nicht um die physische Position des Codes die Zeiger und Register zum Code werden im Speicher gespeichert, wenn ich alles direkt an diesen Punkt senden kann wird normal ausgeführt (ich nehme an). –

Verwandte Themen