当前位置: 首页 > 面试题库 >

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

夏嘉德
2023-03-14
问题内容

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

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


问题答案:

只需将其包装在jar中的任何位置即可。不过,你必须记住一件事-在使用DLL之前,你需要先从JAR中提取这些DLL,然后将其转储到硬盘上的某个位置,否则你将无法加载这些DLL。

所以基本上-我为客户端做了JNI项目,我将在战争中使用这种打包的jar。但是-在运行任何本机方法之前,我将获得DLL作为资源并将其写入光盘到temp目录中。然后,我将运行常规的初始化代码,在该代码中,我的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
}


 类似资料:
  • 我正在尝试加入一些。txt。png和其他文件转换为我的jar文件。我在src文件夹下创建了一个名为“resources”的文件夹。从IDE运行程序时,程序可以正确找到所有文件。但是,只要我用代码创建一个jar文件,就找不到任何文件。当然,我使用了getClass()。getResource(…)。 有人能帮我吗?:/

  • 问题内容: 我有一个包含两个简单的Java swing文件的程序。 如何为程序制作可执行的jar文件? 问题答案: jar文件只是包含Java文件集合的文件。为了使jar文件可执行,你需要指定 Class在jar文件中的位置。示例代码如下。 编译你的类。要制作一个jar,你还需要创建一个清单文件()。例如, 将编译后的输出类文件(JarExample.class,JarExample $ 1.cl

  • 我正在尝试制作一个.jar文件(这是我第一次),我很困惑。我了解如何使用命令提示符创建一个简单的jar文件,但对于我的程序,我导入了JavaMail API和我创建的另一个库(名为ArrayLibrary,其中填充了排序方法)。我如何在一个jar文件中创建这些?

  • 问题内容: 大家好,菜鸟Java问题。 我有一个Java项目,并且想在可执行jar中包含一个文本文件。现在,该文本文件位于默认程序包中。 InputFlatFile currentFile =新的InputFlatFile(“ src / theFile.txt”); 正如您使用src所看到的那样,我使用该行抓取文件。但是,这不适用于可执行jar。 有人可以让我知道如何将文件保存在可执行jar中,

  • 我有一个结构如下的maven项目: 我希望maven jar插件在构建jar文件时打包到数据库文件夹中。我尝试过包含这里概述的内容:https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html,但它找不到目录“../database”(或../../database或../../../database

  • 问题内容: 我记得前一段时间使用eclipse或netbeans时,我能够轻松地将源文件包含在jar文件中。我已移至intellij 10社区版,发现自己需要做同样的事情。有什么提示吗? 问题答案: 我想到了… 单击“输出布局”选项卡中的“ +”按钮->包含目录内容->选择您的src目录。做到了