2010-03-30 3 views
4

J'ai une application qui utilise des méthodes dans un fichier .jar qui appelle un fichier .dll. Cela fonctionne très bien sur ma machine (lorsque l'application est décompactée ou exécutée en tant que .jar elle-même) mais lorsque le fichier application.jar est exécuté sur une autre machine, avec le fichier .dll externe sur le chemin système, il ne peut pas exécuter le fichier dll .Comment référencer un fichier .dll à partir d'un fichier .jar

Le fichier .dll doit-il être placé n'importe où? J'ai supposé que c'était sur le chemin du système qu'il serait trouvé.

Merci à l'avance

Dougie

+0

Peut-être sur le ClassPath, mais je ne sais pas vraiment ... –

+1

Pouvez-vous ajouter plus d'informations sur les systèmes d'exploitation utilisés? En outre, le code Java utilise-t-il simplement JNI ou utilise-t-il une technique spécifique à une plate-forme (comme le chargement de bibliothèques COM avec J-Integra)? Enfin, avez-vous essayé simplement de mettre le fichier DLL et le fichier JAR dans le même répertoire? –

Répondre

0

Je suggère de mettre dans le même dossier que votre application. Cela dit, "il ne peut pas exécuter le fichier dll" est un peu vague ... êtes-vous sûr que ce n'est pas un problème avec l'autre DLL étant une version différente (et donc ne pas charger correctement, plutôt que de ne pas être trouvé à tout)?

En outre, le chemin de recherche de la bibliothèque est définie par la java.library.path parameter.

0

Assuling vous utilisez la machine virtuelle Java Sun l'emplacement des bibliothèques natives peut être spécifiée sur la ligne de commande en réglant le chemin de la bibliothèque Java sur la ligne de commande.

Cela peut être fait avec l'option « -Djava.library.path = répertoire dll »

Il peut dépendre de la façon dont la bibliothèque est chargée dans le code source java. Avez-vous accès à cela? Pouvez-vous poster le code?

Si le code java utilise System.load (String), il attend le chemin complet du dll.

Si elle utilise System.loadLibrary (String) ne requiert que le nom de la bibliothèque et seach à l'emplacement spécifié par le paramètre java.library.path.

1

Essayez d'utiliser:

File dll = new File([...]);

System.load(dll.getAbsolutPath());

je serais empaqueter le dll dans le même répertoire que votre pot-archive.

3

solution java.library.path est pas toujours bon: il y a beaucoup de situations où vous ne pouvez pas changer les paramètres JVM. De meilleures solutions:

1) déjà mentionné: mettre DLL dans le même répertoire que JAR, malheureusement, il fait usage d'un tel JAR plus difficile - maintenant le JAR est pas seulement un JAR, mais a une DLL d'accompagnement

2) mettre la DLL dans le fichier JAR comme une ressource normale, lors de l'extraction au démarrage JAR cette DLL quelque part pour par exemple $ TMP, puis utilisez System.load (nouveau fichier (...)) comme ci-dessus. Alors ce JAR est juste un JAR, les utilisateurs de ce JAR peuvent même ne pas savoir qu'il utilise des DLL

Vous pouvez également utiliser le plugin Maven NAR, qui est assez puissant si vous utilisez Maven pour les builds. Voir http://duns.github.com/maven-nar-plugin/

Questions connexes