如何制作包含DLL文件的JAR文件?

我买了一个包含JAR文件和两个DLL文件的第三方Java库。 我编写了自己的调用第三方JAR文件的Java程序。 现在我的问题是如何将所有代码打包到一个包含我所有代码和第三方JAR和DLL的JAR文件中?

我知道SWT就是这样的情况。 swt.jar包括dll文件,但我不知道如何做到这一点,以及如何使其正常工作。

只要把它包装在jar子里的任何地方。 有一点你必须记住 – 虽然在你使用DLL之前,你需要从JAR中提取这些文件并把它们转储到硬盘上,否则你将无法加载

所以基本上 – 我为客户端做了JNI项目,我将在战争中使用这样的jar包。 但是 – 在运行任何本地方法之前,我会将DLL作为资源并将其写入到临时目录的光盘。 然后,我会运行正常的初始化代码,我的DLL被设置为我刚刚写入DLL的相同位置

哦,以防万一:关于将dll或任何其他文件打包成jar文件没有什么特别之处。 这就像将东西包装成拉链一样

这是我刚刚挖出的一些代码

 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 } 

使用http://www.jdotsoft.com/JarClassLoader.php ,它可以从另一个JAR中加载DLL和JAR,无限制地嵌套。 例如,DLL可能位于另一个根JAR中的JAR中。 所有DLL和JAR都像在类path或库path中一样加载。