可能重复:
如何在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
并签署我的罐子。真的吗?
我不认为Java可执行文件支持 Bundle-NativeCode
。我很确定这是一个 OSGi的 属性。支持的属性列表在。中定义 JAR文件规范。
在提供它的外部框架中,没有内置支持在JAR文件中捆绑本机库。如果我没记错的话,可以将文件解压缩到临时位置并手动加载。
我不认为Java可执行文件支持 Bundle-NativeCode
。我很确定这是一个 OSGi的 属性。支持的属性列表在。中定义 JAR文件规范。
在提供它的外部框架中,没有内置支持在JAR文件中捆绑本机库。如果我没记错的话,可以将文件解压缩到临时位置并手动加载。
有时我发现问题不是加载本机库的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()加载你就完成了。
当程序在该操作系统上运行时尝试挂钩Windows关闭事件时遇到此问题。我最终使用的解决方案基本上是McDowell的 - 将DLL添加到jar文件并在程序启动时将其解压缩到临时位置。如果它适合您的程序,您可以将DLL保留在更永久的位置,然后在后续程序启动时引用它。我的应用程序用在一个用户可能故意删除它们不应该的文件的环境中,所以我不得不在每次运行时提取DLL。但是,它并未导致任何性能影响。