java, System.loadlibrary (& # 8220; someDLLFile & # 8221;) ottiene un errore di collegamento non soddisfatto

StackOverflow https://stackoverflow.com/questions/1029559

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top