将原生dll与jar捆绑在一起

时间:2009-12-04 10:20:01

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

  

可能重复:
  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是否正确?我还听说我应该在manifest.mf中放入dll哈希并签署我的jar。真的吗?

3 个答案:

答案 0 :(得分:6)

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

中定义

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

答案 1 :(得分:6)

有时我发现问题不是加载本机库的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()加载,然后就完成了。

答案 2 :(得分:3)

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