所以我有這個項目在Java中使用我寫的jni .dll(我已經適當地命名爲jniusb),它可以訪問usb-hid設備。我一直在使用它幾個月,直到昨天,當我試圖從jar而不是直接從netbeans啓動我的程序時,沒有任何值得注意的問題。經過一些調試,我的問題描述如下:Java中的loadlibrary問題
點擊jar圖標啓動我的程序而不加載dll。在我的gui中顯示錯誤消息,即使我將我的dll複製到java二進制文件夾(它總是似乎在過去工作),但顯示「沒有java.nibrary.path中的jniusb」。
我調整了代碼來查找當前目錄,並使用「System.load」(將dll複製到與我的jar文件相同的文件夾)而不是「System.loadLibrary」。此方法拋出錯誤「C:\ Users \ bpaik \ Documents \ NetBeansProjects \ JniUsb \ dist \ jniusb.dll:無法在IA 32位平臺上加載AMD 64位.dll」。這使我從頭開始,因爲我絕對是在AMD 64位平臺上工作,並且用完netbeans可以使用相同的dll ...
從命令提示符運行jar(使用java.exe或javaw.exe)加載DLL就好了。我想這也許意味着我有管理員權限問題,所以我通過轉到java可執行文件並授予管理員權限來測試理論,但是這並沒有改變任何內容。 (我也很肯定我以前用過的負載/調用LoadLibrary沒有管理員...)
我是沒有java專家,所以我已經差不多耗盡了我調試的能力,我現在希望有人多一點經驗比我會認識到我所描述的問題,謝謝。
更新:所以我已經解決了這個問題,但我仍然不知道發生了什麼。我做了我的.dll的x86版本,並用我的jar把它扔進文件夾中,一切都加載/工作得很好。所以我猜不知何故(即使我爲我的jar設置默認程序爲x64 JVM),我使用Netbeans中的x64庫構建的jar在32位JVM中運行。總結一下:
- 我的jar是使用netbeans中的x64庫構建的,並且從命令提示符啓動時可以正常運行x64 dll。
- 當從圖標啓動jar(默認程序設置爲x64 java)時,我的程序和JVM以某種方式切換到32位JVM,並且在我使用我的dll的32位版本時工作正常。
- 試圖明確地運行我的jar與32位java根本不工作。我的GUI不顯示並且命令提示符短暫地打開/關閉...
你有幾個JRE/JDK的安裝。至少有一個32位和一個64位?如果是這樣,請檢查命令行中是否默認使用了另一個,而當您「雙擊jar」 – esej
是的,我有一個x86和一個x64。當我從命令運行時,我絕對使用x64版本。我右鍵單擊我的jar圖標並將其設置爲使用x64 java打開,但我仍然遇到了dll問題。只是爲了踢我設置它打開與32位和CMD提示短暫打開和關閉 - 我的GUI永遠不會出現。 – Ben
看起來問題的一部分已經解決了,剩下的就是windows的東西。但似乎你想要同時針對32位和64位系統,而你的dll是64位的 - 這個計劃是否有用? – esej