java, System.loadlibrary (& # 8220; someDLLFile & # 8221;) ottiene un errore di collegamento non soddisfatto
-
06-07-2019 - |
Domanda
Ho scritto alcuni hook JNI in una libreria C ++ e creato alcuni file DLL per il mio progetto java server. Supponiamo che i file DLL e jar siano nella stessa cartella in " C: / server "
Accedo a questi file DLL usando:
System.loadLibrary("someDLLFile");
nella classe che necessita del codice C ++.
Il problema che sto incontrando è quando eseguo questo server sul mio computer, tutto funziona bene indipendentemente da dove posiziono il "server". cartella. Ma quando lo do a un collega per testarlo, ottengono continuamente:
java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path
Vorrei che i file DLL vivessero nella stessa cartella dei file jar e preferirei che qualcuno non configurasse la propria variabile PATH.
Perché System.loadLibrary () funziona sul mio computer indipendentemente dalla posizione della cartella, ma non su un altro computer?
Soluzione
Funziona perché la DLL (o una DLL da cui dipende, ovvero msvcr90.dll o qualcosa del genere) si trova nel PERCORSO sul computer, ma non sull'altro.
Imposta PATH env-var o la proprietà java.library.path in modo che contenga la directory con il tuo file, oppure memorizza la tua dll dove java la trova di default (Molte opzioni qui, a seconda della strategia di distribuzione e della piattaforma).
Altri suggerimenti
Un'opzione è specificare la directory nella riga di comando quando si avvia la VM:
java -classpath C:\server -Djava.library.path=C:\server somePackage.Main
Un'altra opzione è usare System.load
invece di System.loadLibrary
.
URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);
Il rovescio della medaglia è che il tuo programma ora ha a che fare con nomi di directory dipendenti dalla piattaforma, estensioni di file ecc.
Non sono sicuro che sia utile o meno, ma ho incluso quanto segue in alcuni progetti:
http://forums.sun.com/thread.jspa?threadID=707176
Per caricare librerie native.
E poi ho appena caricato la directory bin
String binPath = new File(".").getAbsolutePath()
+ System.getProperty("file.separator") + "bin";
addDir( binPath );
Funziona abbastanza bene.
Ma ancora una volta, non sono sicuro che sia così o no.
Prova a scaricare depend.exe per vedere se la dll dipende da altre dll sul sistema o meno. In tal caso, controlla l'altra macchina, se tali dll sono presenti o meno in Path.