Java中的loadlibrary问题
因此,我有一个java项目,它使用我编写的jni.dll(我恰当地将其命名为jniusb)来访问usb hid设备。我已经使用它好几个月了,没有任何值得注意的问题,直到昨天我才尝试从jar而不是直接从netbeans启动我的程序。经过一点调试后,我将我的问题描述如下: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吗?看起来,当您自己运行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,则应该始终是安全的。