Question

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. Ma question est la suivante: comment puis-je regrouper tout mon code dans un fichier JAR unique comprenant tout mon code, ainsi que les fichiers JAR et DLL tiers?

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

Était-ce utile?

La solution

Il suffit de l’emballer n’importe où dans le pot. Vous devez cependant garder à l’esprit que, avant d’utiliser les DLL, vous devez les extraire du fichier JAR et les transférer sur le disque dur quelque part, sinon vous ne pourrez pas les charger

.

Donc, fondamentalement, j’ai réalisé le projet JNI pour le client, dans lequel je vais utiliser un tel bocal emballé pendant la guerre. Cependant, avant d’exécuter des méthodes natives, j’obtenais la DLL en tant que ressource et l’écrivais sur le disque dans le répertoire temporaire. Ensuite, je voudrais exécuter du 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’ya rien de spécial à propos de l’emballage de dll ou de tout autre fichier dans un fichier jar. C'est comme emballer des choses dans un zip

Voici un code que je viens de creuser

public class Foo {
private static final String LIB_BIN = "/lib-bin/";
private final static Log logger = LogFactory.getLog(ACWrapper.class);
private final static String ACWRAPPER = "acwrapper";
private final static String AAMAPI = "aamapi51";
private final static String 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
    String 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(String path, String 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.toString());
    } catch (Exception e) {
        throw new ACCoreException("Failed to load required DLL", e);
    }
}
    // blah-blah - more stuff
}

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top