问题 将原生dll与jar捆绑[重复]


可能重复:
如何在JAR中捆绑本机库和JNI库? 

我需要在我的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 并签署我的罐子。真的吗?


12637
2017-12-04 10:20


起源



答案:


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

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


6
2017-12-04 10:50



谢谢你的回答。我想我会尝试将它包装成exe。我可以制作简单的bat批处理文件,但我更喜欢只有一个文件。但我还没有找到合适的工具。我尝试过Lunch4j,但它没有添加本机库的选项。 - Maciek Sawicki
我包含了dll文件 user.dir 它工作得很好。 - Jus12


答案:


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

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


6
2017-12-04 10:50



谢谢你的回答。我想我会尝试将它包装成exe。我可以制作简单的bat批处理文件,但我更喜欢只有一个文件。但我还没有找到合适的工具。我尝试过Lunch4j,但它没有添加本机库的选项。 - Maciek Sawicki
我包含了dll文件 user.dir 它工作得很好。 - Jus12


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

问题是第三方库将在某些时候(通常在初始化的早期)

System.loadLibrary("native.dll"); 

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

如果您可以访问第三方库的java源代码,那么修补该代码可能很容易,您可以在使用第三方库之前轻松地从JAR中提取您的dll并运行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()加载你就完成了。


6
2017-12-04 14:24



好的,但我认为这不是我的问题:“要使用JNotify,你需要在java.library.path中拥有本机库(jnotify.dll或jnotify.so)。为此,你需要在运行java应用程序时使用-Djava.library.path参数。例如:java -cp jnotify.jar -Djava.library.path =。“ - Maciek Sawicki
非常感谢。你100%正确。我正在考虑创建蝙蝠,并认为改变dll的位置应该是一个问题。当我读到你的答案时,我想“我检查过我可以用我的del做所有事情”,但我正在检查完全不同的事情。我一定很累。 - Maciek Sawicki


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


3
2017-12-04 14:03



你有任何代码片段吗? - Maciek Sawicki
看到 stackoverflow.com/a/4691879/116509 - artbristol