如何制作包含 DLL 文件的 JAR 文件? [英] How to make a JAR file that includes DLL files?

查看:42
本文介绍了如何制作包含 DLL 文件的 JAR 文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I bought a third-party Java library which includes a JAR file and two DLL files. I wrote my own Java program which invoke the third-party JAR file. Now my question is how can I package all my code into a single JAR file which include all my code and the third-party JAR and DLLs?

我知道SWT就是这种情况.swt.jar 包含 dll 文件,但我不知道如何执行此操作以及如何使其正常工作.

I know SWT is such a case. The swt.jar includes dll files, but I don't know how to do this and how to make it work properly.

推荐答案

只需将其打包到 jar 中的任何位置即可.不过,您必须记住一件事 - 在您可以使用 DLL 之前,您需要从 JAR 中实际提取这些 DLL 并将它们转储到硬盘上的某个地方,否则您将无法加载这些

Just package it anywhere in the jar. One thing you have to keep in mind though - before you can use the DLLs you need to actually extract these from the JAR and dump these on the hard disk somewhere otherwise you won't be able to load these

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

So basically - I did JNI project for the client where I will use such jar packaged within the war. However - before running any native methods I would get the DLL as a resource and write it to the disc into temp directory. Then I would run regular initialization code where my DLL is set to the same location I just wrote DLL to

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

Oh, and just in case: there's nothing special about packaging dll or any other file into jar. It's just like packaging stuff into zip

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

Here's some code I just digged out

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
}

这篇关于如何制作包含 DLL 文件的 JAR 文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆