【问题标题】:loadlibrary issues in JavaJava中的加载库问题
【发布时间】:2012-05-25 17:50:35
【问题描述】:

所以我在 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 可执行文件并授予管理员权限来测试该理论,但这并没有改变任何东西。 (而且我也很确定我之前在没有管理员的情况下使用过 load/loadlibrary...)

我不是 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 不显示,命令提示符短暂打开/关闭...

【问题讨论】:

  • 您安装了多个 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


【解决方案1】:

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

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

【讨论】:

  • -d64 运行程序并很好地加载了我的 dll,但 -d32 显示“错误:此 Java 实例不支持 32 位 JVM”。另外,我很早就通过右键单击 jar 并指定我想使用的 java 来检查我是否使用了正确的 JVM。在 netbeans 中,我将属性设置为进行 64 位构建,所以我很困惑这如何在 32 位 JVM 上打开。
  • 我做了上面更新部分提到的更多测试。你似乎是对的,但我仍然对发生的事情感到困惑......
  • 您的机器上可能有 3 个完全独立的 java 安装。 Netbeans 使用的一种,命令行使用的一种,双击机器使用的一种。每个都可以是 32、64 或两者,如果两者都有,则使用不同的默认值。
  • 如果您提供 32 位和 64 位版本的 DLL,您应该始终是安全的。
【解决方案2】:

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

【讨论】:

  • 是的,我打算发布该程序的 32 位和 64 位版本(但 32 位应该是 x86 而不是 IA 32)。 java -version 表示“java 版本 1.7.0、Java(TM) SE Runtime Environment (build 1.7.0-b147)、Java HotSpot(TM) 64-bit Server VM (build 21.0-b17, mixed mode)” - 和我不知道这意味着什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多