【问题标题】:Packaging JNI Libraries [duplicate]打包 JNI 库 [重复]
【发布时间】:2010-09-27 09:32:37
【问题描述】:
我正在使用 Java 开发应用程序,并且我有一个需要能够使用的库。该库有一个 jar 文件和一个 dll 文件。目前我已将 dll 文件放入我的系统文件夹并将 jar 与 IDE 链接。我的问题是,我想将所有内容打包到一个可执行的 jar 中,用户可以在其中运行(可能使用 webstart)。
如何在不让用户复制系统文件夹中的 dll 的情况下生成这个 jar 文件?有没有办法可以将所有内容都放在一个存档中?
【问题讨论】:
标签:
java
windows
java-native-interface
【解决方案1】:
您可以将.dll 打包到.jar 中,但是由于Windows 处理.dlls 的方式,必须从那里解压缩物理.dll 文件才能加载它。无法直接从.jar 内部加载.dll。
This question 似乎包含适当的实现。但是请注意,这有点容易出错:如果程序没有写入权限到它将提取.dll 的任何位置,那么您处于一个奇怪的情况;你无法加载.dll,因为你没有权限先写它。
更强大的解决方案是使用某种安装程序将整个应用程序安装到目录层次结构中,例如
/whatEver/myApp/ (The working directory of the app.)
/whatEver/myApp/myApp.jar (The main app.)
/whatEver/myApp/lib/library.dll (The JNI library.)
然后您可以简单地使用相对于工作目录的路径来加载 dll,
System.loadLibrary("lib/library.dll");
为了更加健壮,您需要确保在尝试加载库之前运行的 JVM 具有适当的位数。一个鲜为人知的事实是 64 位 VM 不能加载 32 位库,反之亦然。请参阅this 问题。