0

所以我在java中有这个项目,它使用我编写的jni .dll(我恰当地命名为jniusb),它可以访问usb-hid设备。我已经使用它几个月了,直到昨天我尝试从 jar 而不是直接从 netbeans 启动我的程序时,才出现任何明显问题。经过一些调试后,我将我的问题描述如下:

  1. 单击 jar 图标启动我的程序而不加载 dll。在我的 gui 中显示错误消息显示“java.library.path 中没有 jniusb”,即使我将我的 dll 复制到 java 二进制文件夹(过去似乎总是有效)。

  2. 我调整了代码以找到当前目录并使用“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 ...

  3. 从命令提示符(使用 java.exe 或 javaw.exe)运行 jar 加载 dll 就好了。我认为这可能意味着我遇到了管理员权限问题,所以我通过转到 java 可执行文件并授予管理员权限来测试该理论,但这并没有改变任何东西。(而且我也很确定我以前在没有管理员的情况下使用过加载/加载库......)

我不是 java 专家,所以我已经用尽了我的调试能力,现在希望比我有更多经验的人能认识到我所描述的问题,谢谢。

更新:所以我已经解决了这个问题,但我仍然不知道发生了什么。我对我的 .dll 进行了 x86 构建,并将其与我的 jar 一起放入文件夹中,一切都加载/工作得很好。所以我猜想以某种方式(即使我将我的 jar 的默认程序设置为 x64 JVM)我用 Netbeans 中的 x64 库构建的 jar 在 32 位 JVM 中运行。总结一下:

  1. 我的 jar 是使用 netbeans 中的 x64 库构建的,并且在从命令提示符启动时使用 x64 dll 运行良好。
  2. 当从图标启动 jar(默认程序设置为 x64 java)时,我的程序和 JVM 以某种方式切换到 32 位 JVM,并且当我使用 32 位版本的 dll 时工作正常。
  3. 试图用 32 位 java 显式运行我的 jar 根本不起作用。我的 gui 不显示,命令提示符短暂打开/关闭...
4

2 回答 2

0

您的机器上是否安装了多个版本的 Java?看来,当您自己运行 jar 时,您的机器正在为它创建一个 32 位 VM。打开命令提示符并键入java -version以检查正在使用的 Java 版本。

于 2012-05-25T17:58:28.330 回答
0

问题 2 肯定是由您运行 32 位 JVM 引起的。Netbeans 大概运行 64 位 JVM。您需要使用 Launch4j 之类的工具来加载正确的 JVM(或同时包含 32 位和 64 位版本的 DLL)。

从命令行,尝试 -d32 和 -d64 来测试该理论。

于 2012-05-25T18:00:42.757 回答