所以我在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 可执行文件并授予管理员权限来测试该理论,但这并没有改变任何东西。(而且我也很确定我以前在没有管理员的情况下使用过加载/加载库......)
我不是 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 不显示,命令提示符短暂打开/关闭...