将原生dll与jar捆绑在一起

Mac*_*cki 11 java java-native-interface netbeans jar manifest.mf

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

我需要在我的jar中包含本机lib(jnotify,但我认为这没关系).我想用NetBeans来做.

我添加Bundle-NativeCode: /lib/jnotify.dll; osname=win32到我的manifest.mf文件并添加jnotify.dllprojektHome\src\lib\文件夹.但遗憾的是NetBeans正在覆盖 manifest.mf文件.

我怎么修好?我是否可以仅使用NetBeans执行此操作?这是Bundle-NativeCode: /lib/jnotify.dll; osname=win32正确的吗?我还听说我应该把dll哈希manifest.mf并签上我的罐子.真的吗?

McD*_*ell 6

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

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


Pet*_*Mmm 6

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

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

System.loadLibrary("native.dll"); 
Run Code Online (Sandbox Code Playgroud)

如果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 + ")");
        }
    }
Run Code Online (Sandbox Code Playgroud)

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