Java中的loadlibrary问题

Java中的loadlibrary问题,java,dll,netbeans,java-native-interface,loadlibrary,Java,Dll,Netbeans,Java Native Interface,Loadlibrary,因此,我有一个java项目,它使用我编写的jni.dll(我恰当地将其命名为jniusb)来访问usb hid设备。我已经使用它好几个月了,没有任何值得注意的问题,直到昨天我才尝试从jar而不是直接从netbeans启动我的程序。经过一点调试后,我将我的问题描述如下: 单击jar图标启动我的程序,而不加载dll。在gui中显示错误消息时显示“java.library.path中没有jniusb”,即使我将dll复制到java二进制文件文件夹(在过去似乎总是可以工作) 我调整代码以查找当前目录,并

因此,我有一个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:无法在IA 32位平台上加载AMD 64位.dll”。这让我摸不着头脑,因为我肯定是在AMD 64位平台上工作,而且使用相同dll的netbeans作品也快用完了

  • 从命令提示符运行jar(使用java.exe或javaw.exe)可以很好地加载dll。我想这可能意味着我有管理员权限问题,所以我通过访问java可执行文件并授予管理员权限来测试理论,但这并没有改变任何事情。(我也很确定我以前在没有管理员的情况下使用过load/loadlibrary…)

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

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

  • 我的jar是用netbeans中的x64库构建的,当从命令提示符启动时,它可以与x64 dll一起正常运行
  • 当从图标启动jar(默认程序设置为x64Java)时,我的程序和JVM以某种方式切换到32位JVM,并且在使用32位版本的dll时工作正常
  • 试图用32位java显式运行我的jar根本不起作用。我的gui不显示,命令提示符会短暂打开/关闭
    您的机器上安装了多个版本的Java吗?看起来,当您自己运行jar时,您的机器正在为它创建一个32位VM。打开命令提示符并键入
    java-version
    ,以检查正在使用的java版本

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


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

    您已经安装了多个JRE/JDK。至少一个32位和一个64位?如果是这样,请检查命令行中是否默认使用了一个命令行,以及“双击一个jar”时是否使用了另一个命令行。是的,我有一个x86和一个x64。当我从命令运行时,我肯定使用x64版本。我右键单击我的jar图标并将其设置为使用x64Java打开,但仍然存在dll问题。只是为了好玩,我将它设置为32位打开,cmd提示符会短暂地打开和关闭-我的gui从来没有出现过。看来部分问题已经解决了,剩下的是windows的东西。但似乎你想同时针对32位和64位系统,而你的dll是64位的——这个计划行得通吗?我编译了一个x86版本的.dll,它可以工作(我用32位版本的jar测试了它)。是的,我打算同时发布32位和64位版本的程序(但32位应该是x86而不是IA 32)。java版本说“java版本1.7.0,java(TM)SE运行时环境(构建1.7.0-b147),java热点(TM)64位服务器VM(构建21.0-b17,混合模式)”,我不知道这意味着什么…-d64运行程序并加载了我的dll,但-d32说“错误:此java实例不支持32位JVM”。另外,我通过右键单击jar并指定要使用的java,在早期检查了我是否使用了正确的JVM。在netbeans中,我将属性设置为执行64位构建,因此我不知道这在32位JVM上是如何打开的。您似乎是对的,但我仍然对发生的事情感到困惑…您的机器上可能有3个完全独立的java安装。一个用于Netbeans,一个用于命令行,另一个用于双击机器。每个都可以是32、64或两者,如果两者都有,则默认值不同。如果提供32位和64位版本的DLL,则应该始终是安全的。