首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何制作包含DLL文件的JAR文件?

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

Stack Overflow用户
提问于 2009-10-23 12:20:47
回答 2查看 84.3K关注 0票数 73

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

我知道SWT就是这样一个案例。swt.jar包含动态链接库文件,但我不知道如何做到这一点,以及如何使其正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-23 12:27:13

只要把它打包在罐子里的任何地方。但是,您必须记住一件事-在使用DLL之前,您需要从JAR中实际提取这些DLL,并将它们转储到硬盘上的某个位置,否则您将无法加载这些DLL

所以基本上-我为客户做了JNI项目,在那里我将使用war中打包的jar。但是,在运行任何本机方法之前,我会将DLL作为资源获取,并将其写入到光盘的temp目录中。然后,我将运行常规的初始化代码,其中我的DLL被设置到我刚刚编写的DLL所在的位置

哦,以防万一:将dll或任何其他文件打包到jar中并没有什么特别之处。就像把东西打包成zip一样

这是我刚翻出来的一些代码

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
}
票数 87
EN

Stack Overflow用户

发布于 2010-03-09 23:19:20

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1611357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档