4 Stimmen

JNA: Abhängigkeiten von nativer Bibliothek und JAR-Extraktion

Ich werde auf die MSP430.dll (siehe hier) über JNA zugreifen. Aber diese Bibliothek hat eine Abhängigkeit zu einer anderen nativen Bibliothek, die zusammen mit der MSP430.dll gebündelt ist. Diese abhängige native Bibliothek wird HIL.dll genannt. Mit der Verwendung von jna.library.path funktioniert alles perfekt. Jetzt möchte ich die nativen Bibliotheken zu meinem eigenen .jar-Paket bündeln. Dann würde ich die automatische nativen Bibliotheksladung aus dem Jar des JNA-Frameworks nutzen. Aber das macht Probleme mit nativen Bibliotheken, die Abhängigkeiten haben. Wenn ich die MSP430.dll und HIL.dll zu meinem .jar-Paket hinzufüge, erhalte ich folgenden Fehler: "JNA java.lang.UnsatisfiedLinkError und Das angegebene Modul konnte nicht gefunden werden". Das bedeutet, es war nicht möglich, die Abhängigkeiten der MSP430.dll zur HIL.dll aufzulösen. In den Debug-Ausgaben von JNA kann ich sehen, dass nur die MSP430.dll aus dem .jar-Paket extrahiert wird. In diesem Zusammenhang ist der Fehler verständlich. Im nächsten Versuch lade ich die HIL.dll explizit und kann sehen, dass zuerst die HIL.dll und dann die MSP430.dll extrahiert wird. Aber ich erhalte immer noch den Modulfehler von JNA.

Ich habe mir den JNA-Code der Extraktionsmethode angesehen. Ich sehe, dass JNA die nativen Bibliotheken in das temporäre Systemverzeichnis extrahiert und dort ein eigenes temporäres Verzeichnis erstellt. Aber jetzt denke ich, dass das Problem darin besteht, dass JNA temporäre Dateien für die nativen Bibliotheken mit dem Präfix "jna" und einem eindeutig generierten numerischen Wert erstellt. Hier die Ausgabe von JNA:

Gefundene Bibliothek 'HIL.dll' unter C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll

Ich denke, die MSP430.dll benötigt die unbenannte HIL.dll, um sie zu finden. Ich habe mit dem direkten Laden der HIL.dll mit dem folgenden ersten Aufruf in der Anwendung getestet

System.loadLibrary(C:\\absolutepath\\HIL.dll);

Dann lädt nur die MSP430.dll über JNA aus dem .jar-Paket, das funktioniert ohne Probleme. Danach benenne ich die HIL.dll in lol.dll um und verwende diesen Aufruf:

System.loadLibrary(C:\\absolutepath\\lol.dll);

dann erhalte ich den Modulfehler erneut von JNA. Die MSP430.dll konnte die umbenannte HIL.dll nicht auflösen.

Ist es überhaupt möglich, eine native Bibliothek mit Abhängigkeiten zu einem .jar-Paket zu bündeln und mit JNA zu laden?

Hier die JNA-Debug-Ausgabe mit dem expliziten Laden von HIL.dll über JNA:

C:\Users\RD3\Desktop>call "C:\Program Files (x86)\Java\jre1.8.0_25\bin\java.exe"
 -Djna.debug_load=true -jar C:\Data\Workspace\NetBeans\MspApiTest\target\MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar
Suche im Klassenpfad von sun.misc.Launcher$AppClassLoader@1f96302 nach /com/sun/jna/win32-x86/jnidispatch.dll
Gefundene Bibliotheksressource unter jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/com/sun/jna/win32-x86/jnidispatch.dll
Suche nach Bibliothek 'HIL.dll'
Hinzufügen von Pfaden aus jna.library.path: null
Versuch HIL.dll
Hinzufügen von Systempfaden: []
Versuch HIL.dll
Suche nach Präfix 'lib-'
Versuch libHIL.dll
Suche im Klassenpfad von sun.misc.Launcher$AppClassLoader@1f96302 nach HIL.dll
Gefundene Bibliotheksressource unter jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/HIL.dll
Gefundene Bibliothek 'HIL.dll' unter C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll
Suche nach Bibliothek 'MSP430.dll'
Hinzufügen von Pfaden aus jna.library.path: null
Versuch MSP430.dll
Hinzufügen von Systempfaden: []
Versuch MSP430.dll
Suche nach Präfix 'lib-'
Versuch libMSP430.dll
Suche im Klassenpfad von sun.misc.Launcher$AppClassLoader@1f96302 nach MSP430.dll
Gefundene Bibliotheksressource unter jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/MSP430.dll
Ausnahme im Thread "main" java.lang.UnsatisfiedLinkError: Das angegebene Modul wurde nicht gefunden.

        at com.sun.jna.Native.open(Native Method)
        at com.sun.jna.Native.open(Native.java:1759)
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
        at com.sun.jna.Library$Handler.(Library.java:147)
        at com.sun.jna.Native.loadLibrary(Native.java:412)
        at com.sun.jna.Native.loadLibrary(Native.java:391)
        at de.sitec.jmspflash.Msp430Native.(Msp430Native.java:22)
        at de.sitec.jmspflash.Msp430Impl.init(Msp430Impl.java:50)
        at de.sitec.jmspflash.Msp430Impl.createMsp430Impl(Msp430Impl.java:36)
        at de.sitec.mspapitest.App.main(App.java:34)

C:\Users\RD3\Desktop>

Mit freundlichen Grüßen

3voto

technomage Punkte 9525

Vorausgesetzt, dass das einzige Problem, das Sie haben, der Name der abhängigen Bibliothek ist, siehe Native.extractFromResourcePath(). Sie können das verwenden, um Ihre nicht expliziten Abhängigkeiten zu extrahieren und File.rename() zu benutzen, um sicherzustellen, dass die Bibliothek den gewünschten Namen hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X