【发布时间】:2012-05-25 17:50:35
【问题描述】:
所以我在 java 中有这个项目,它使用我编写的 jni .dll(我恰当地命名为 jniusb),它可以访问 USB-hid 设备。我已经使用它几个月了,直到昨天我试图从 jar 而不是直接从 netbeans 启动我的程序。经过一些调试后,我将我的问题描述如下:
单击 jar 图标启动我的程序,而不加载 dll。在我的 gui 中显示错误消息显示“java.library.path 中没有 jniusb”,即使我将我的 dll 复制到 java 二进制文件夹(过去似乎总是有效)。
我调整了代码以找到当前目录并使用“System.load”(将 dll 复制到与我的 jar 相同的文件夹中)而不是“System.loadLibrary”。这种方法引发了错误“C:\Users\bpaik\Documents\NetBeansProjects\JniUsb\dist\jniusb.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform”。这让我摸不着头脑,因为我绝对是在 AMD 64 位平台上工作,并且用相同的 dll 用完了 netbeans...
从命令提示符(使用 java.exe 或 javaw.exe)运行 jar 可以很好地加载 dll。我认为这可能意味着我遇到了管理员权限问题,所以我通过转到 java 可执行文件并授予管理员权限来测试该理论,但这并没有改变任何东西。 (而且我也很确定我之前在没有管理员的情况下使用过 load/loadlibrary...)
我不是 java 专家,所以我已经用尽了我的调试能力,现在希望比我有更多经验的人能认识到我所描述的问题,谢谢。
更新:所以我已经解决了问题,但我仍然不知道发生了什么。我对我的 .dll 进行了 x86 构建,并将其与我的 jar 一起放入文件夹中,一切都加载/工作得很好。所以我想不知何故(即使我将我的 jar 的默认程序设置为 x64 JVM)我用 Netbeans 中的 x64 库构建的 jar 在 32 位 JVM 中运行。总结一下:
- 我的 jar 是使用 netbeans 中的 x64 库构建的,并且在从命令提示符启动时可以使用 x64 dll 正常运行。
- 从图标启动 jar 时(默认程序设置为 x64 java),我的程序和 JVM 以某种方式切换到 32 位 JVM,并且在我使用 32 位版本的 dll 时工作正常。
- 尝试使用 32 位 java 显式运行我的 jar 根本不起作用。我的 gui 不显示,命令提示符短暂打开/关闭...
【问题讨论】:
-
您安装了多个 JRE/JDK。至少一个 32 位和一个 64 位?如果是这样,请检查是否在命令行中默认使用一个,当您“双击-a-jar”时使用另一个
-
是的,我有一个 x86 和一个 x64。当我从命令运行时,我肯定使用 x64 版本。我右键单击我的 jar 图标并将其设置为使用 x64 java 打开,但我仍然遇到 dll 问题。只是为了好玩,我将它设置为以 32 位打开,并且 cmd 提示符会短暂打开和关闭 - 我的 gui 永远不会出现。
-
看来问题的一部分已经解决了,剩下的就是windows-things。但是您似乎想要同时针对 32 位和 64 位系统,并且您的 dll 是 64 位的 - 这个计划会奏效吗?
-
我编译了一个可以工作的 x86 版本的 .dll(我用 32 位版本的 jar 对其进行了测试)
标签: java dll netbeans java-native-interface loadlibrary