【问题标题】:Bundling native dll with jar [duplicate]用 jar 捆绑本机 dll [重复]
【发布时间】:2010-12-23 04:42:55
【问题描述】:

可能重复:
How to bundle a native library and a JNI library inside a JAR?

我需要在我的 jar 中包含本机库(jnotify 但我认为这并不重要)。我想用 NetBeans 来做。

我将Bundle-NativeCode: /lib/jnotify.dll; osname=win32 添加到我的manifest.mf 文件并将jnotify.dll 添加到projektHome\src\lib\ 文件夹。但不幸的是,NetBeans 覆盖了manifest.mf 文件。

我该如何解决?我可以只使用 NetBeans 做到这一点吗? 'Bundle-NativeCode: /lib/jnotify.dll; osname=win32 行是否正确?我还听说我应该将 dll 哈希放入 manifest.mf 并签署我的 jar。真的吗?

【问题讨论】:

    标签: java netbeans jar java-native-interface manifest.mf


    【解决方案1】:

    我认为 Java 可执行文件不支持 Bundle-NativeCode。我很确定这是一个OSGi 属性。支持的属性列表在JAR File Specification 中定义。

    在提供它的框架之外,没有内置支持将本地库捆绑到 JAR 文件中。如果我没记错的话,可以将文件提取到临时位置并手动加载。

    【讨论】:

    • 感谢您的回答。我想我会尝试将它包装成exe。我可以制作简单的 bat 批处理文件,但我更喜欢只有一个文件。但是我还没有找到合适的工具。我尝试了Lunch4j,但它没有添加本机库的选项。
    • 我将 dll 文件包含在 user.dir 中,效果很好。
    【解决方案2】:

    有时我发现问题不在于加载本机库的 Java 方式,而是需要该本机代码的第 3 方库。

    问题是第 3 方库会在某个时候执行(通常在初始化的早期)

    System.loadLibrary("native.dll"); 
    

    如果 native.dll 不在适当的位置,则会引发错误。

    如果您可以访问 3rd 方库的 java 源代码,那么修补该代码可能很容易,并且您可以轻松地从 JAR 中提取 dll 并在使用 3rd 方库之前运行 System.load。

    更新 我查看了 JNotify 来源。这正是我所说的:

    public class JNotify_win32
    {
        static
        {
            System.loadLibrary("jnotify"); /* *** */
            int res = nativeInit();
            if (res != 0)
            {
                throw new RuntimeException("Error initialiing native library. (#" + res + ")");
            }
        }
    

    取出线 *** 或用 try-catch 包围,用 System.load() 加载,你就完成了。

    【讨论】:

    • 好点,但我认为这对我来说不是问题:“要使用 JNotify,您需要在 java.library.path 中有本地库(jnotify.dll 或 jnotify.so) . 为此,您需要在运行 java 应用程序时使用 -Djava.library.path 参数。例如:java -cp jnotify.jar -Djava.library.path=。"
    • 非常感谢。你是 100% 正确的。我正在考虑创建 bat 并认为更改 dll 的位置应该是一个问题。当我阅读您的答案时,我想“我检查过我可以用我的 del 做所有事情”,但我检查的是完全不同的事情。我一定累了。
    【解决方案3】:

    当程序在该操作系统上运行时尝试挂钩 Windows 关闭事件时,我遇到了这个问题。我最终使用的解决方案本质上是 McDowell 的 - 将 DLL 添加到 jar 文件中,并在程序启动时将其解压缩到临时位置。如果它适合您的程序,您可以将 DLL 保留在更永久的位置,然后在后续程序启动时引用它。我的应用程序是在用户可能故意删除他们不应该删除的文件的环境中使用的,因此我必须在每次运行时提取 DLL。但是,它并未对性能造成任何重大影响。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多