SORU
23 EKİM 2009, Cuma


Nasıl DLL dosyaları içeren bir JAR dosyası yapmak için?

JAR dosyası ve iki DLL dosyaları içerir üçüncü taraf Java kitaplık aldım. Üçüncü taraf JAR dosyasını çağırmak kendi Java programımı yazdım. Şimdi benim sorumnasıl benim kod ve üçüncü taraf KAVANOZ ve DLL içeren tek bir JAR dosyası içine tüm kod paketi alabilir miyim?

Teşekkürler.

S. S.
Biliyorumccböyle bir dava. Bu swt.jar DLL vardır, ama bunu yapmak için nasıl ve düzgün bir şekilde çalışması için nasıl bilmiyorum.

CEVAP
23 EKİM 2009, Cuma


Sadece her yerde kavanoza paketi. Bir şey var akılda tutulması gereken ama önce kullanabilirsiniz Silmek gerekir aslında özü bu KAVANOZ ve dökümü bu da sabit disk üzerinde bir yerde aksi mümkün olmayacaktır yük bu

Bu jar savaş içinde paketlenmiş kullanacağım yerde yani aslında müşteri için bir proje yaptım JNI. Ancak, herhangi bir doğal yöntemleri çalıştırmadan önce bir kaynak olarak DLL ve temp dizini içine diske yazmak istiyorum. Sonra DLL sadece DLL yazdım aynı konuma ayarlandığı normal başlatma kodu çalıştırmak istiyorum

Oh, ve her ihtimale karşı: kavanoza ambalaj dll veya başka bir dosya ile ilgili özel bir şey yok. Zip içine paketleme şeyler gibi

Burada sadece kazılırken bazı kod

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
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alexander Johnson

    Alexander Jo

    26 Temmuz 2008
  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Dan Gately

    Dan Gately

    13 AĞUSTOS 2006