Comment créer un fichier JAR contenant des fichiers DLL?

J’ai acheté une bibliothèque Java tierce comprenant un fichier JAR et deux fichiers DLL. J’ai écrit mon propre programme Java qui appelle le fichier JAR tiers. Maintenant, ma question est la suivante: comment puis-je empaqueter tout mon code dans un seul fichier JAR comprenant tout mon code et les fichiers JAR et DLL tiers?

Je sais que SWT est un tel cas. swt.jar inclut les fichiers dll, mais je ne sais pas comment faire et comment le faire fonctionner correctement.

    Il suffit de l’emballer n’importe où dans le pot. Une chose que vous devez garder à l’esprit – avant de pouvoir utiliser les DLL dont vous avez besoin pour les extraire du JAR et les sauvegarder sur le disque dur, vous ne pourrez pas les charger.

    Donc, fondamentalement, j’ai réalisé un projet JNI pour le client où j’utiliserai un tel pot emballé pendant la guerre. Cependant, avant d’exécuter des méthodes natives, j’obtiendrais la DLL en tant que ressource et je l’écrirais sur le disque dans le répertoire temp. Ensuite, je lancerais un code d’initialisation régulier où ma DLL est définie sur le même emplacement que je viens d’écrire DLL à

    Oh, et juste au cas où: il n’y a rien de spécial dans l’emballage de dll ou de tout autre fichier dans jar. C’est comme emballer des choses dans zip

    Voici un code que je viens de trouver

     public class Foo { private static final Ssortingng LIB_BIN = "/lib-bin/"; private final static Log logger = LogFactory.getLog(ACWrapper.class); private final static Ssortingng ACWRAPPER = "acwrapper"; private final static Ssortingng AAMAPI = "aamapi51"; private final static Ssortingng LIBEAU = "libeay32"; static { logger.info("Loading DLL"); try { System.loadLibrary(ACWRAPPER); logger.info("DLL is loaded from memory"); } catch (UnsatisfiedLinkError e) { loadFromJar(); } } /** * When packaged into JAR extracts DLLs, places these into */ private static void loadFromJar() { // we need to put both DLLs to temp dir Ssortingng path = "AC_" + new Date().getTime(); loadLib(path, ACWRAPPER); loadLib(path, AAMAPI); loadLib(path, LIBEAU); } /** * Puts library to temp dir and loads to memory */ private static void loadLib(Ssortingng path, Ssortingng name) { name = name + ".dll"; try { // have to use a stream InputStream in = ACWrapper.class.getResourceAsStream(LIB_BIN + name); // always write to different location File fileOut = new File(System.getProperty("java.io.tmpdir") + "/" + path + LIB_BIN + name); logger.info("Writing dll to: " + fileOut.getAbsolutePath()); OutputStream out = FileUtils.openOutputStream(fileOut); IOUtils.copy(in, out); in.close(); out.close(); System.load(fileOut.toSsortingng()); } catch (Exception e) { throw new ACCoreException("Failed to load required DLL", e); } } // blah-blah - more stuff } 

    Utilisez http://www.jdotsoft.com/JarClassLoader.php pour charger les DLL et les JAR d’un autre JAR avec une imbrication illimitée. Par exemple, DLL pourrait être dans JAR qui se trouve dans un autre JAR racine. Toutes les DLL et tous les JAR sont chargés comme ils se trouvent dans un chemin de classe ou un chemin de bibliothèque.