67 votes

comment faire un fichier jar qui incluent des fichiers dll

j'ai acheté un tiers bibliothèque java qui incluent un fichier jar et deux fichiers dll. j'ai écrit mon propre programme java qui invoquent le tiers de fichier jar. maintenant, ma question est comment puis-je forfait tout mon code dans un seul fichier jar qui comprennent tout mon code et le tiers pot et les dll? un grand merci.

ps: je sais swt est un tel cas. l'swt.jar inclure les dll, mais je ne sais pas comment faire et comment le faire fonctionner correctement.

79voto

Bostone Points 14208

Juste emballer n'importe où dans le bocal. Une chose que vous devez garder à l'esprit que - avant vous pouvez utiliser la Dll, vous devez extraire ces du POT et de vidage de ces derniers sur le disque dur quelque part, sinon vous ne serez pas en mesure de charger ces

Donc, fondamentalement, - je n'ai JNI projet pour le client, je vais utiliser ces jar emballé dans la guerre. Cependant avant d'exécuter une des méthodes indigènes, je voudrais obtenir la DLL en tant que ressource et de l'écrire sur le disque dans le répertoire temp. Alors je voudrais exécuter régulièrement le code d'initialisation d'où ma DLL est défini de la même position que je viens d'écrire une DLL pour

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

Voici un code j'ai juste votés hors

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
}

6voto

gorokhmn Points 21

Utilisation http://www.jdotsoft.com/JarClassLoader.php qui pourrait charger les Dll et les Pots à partir d'un autre POT avec un nombre illimité de nidification. Par exemple, DLL peut être dans le BOCAL qui est dans une autre racine JAR. Toutes les Dll et les Pots sont chargés comme ils sont dans une classpath ou chemin de la bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X