2012-05-25 23 views
0

所以我有這個項目在Java中使用我寫的jni .dll(我已經適當地命名爲jniusb),它可以訪問usb-hid設備。我一直在使用它幾個月,直到昨天,當我試圖從jar而不是直接從netbeans啓動我的程序時,沒有任何值得注意的問題。經過一些調試,我的問題描述如下:Java中的loadlibrary問題

  1. 點擊jar圖標啓動我的程序而不加載dll。在我的gui中顯示錯誤消息,即使我將我的dll複製到java二進制文件夾(它總是似乎在過去工作),但顯示「沒有java.nibrary.path中的jniusb」。

  2. 我調整了代碼來查找當前目錄,並使用「System.load」(將dll複製到與我的jar文件相同的文件夾)而不是「System.loadLibrary」。此方法拋出錯誤「C:\ Users \ bpaik \ Documents \ NetBeansProjects \ JniUsb \ dist \ jniusb.dll:無法在IA 32位平臺上加載AMD 64位.dll」。這使我從頭開始,因爲我絕對是在AMD 64位平臺上工作,並且用完netbeans可以使用相同的dll ...

  3. 從命令提示符運行jar(使用java.exe或javaw.exe)加載DLL就好了。我想這也許意味着我有管理員權限問題,所以我通過轉到java可執行文件並授予管理員權限來測試理論,但是這並沒有改變任何內容。 (我也很肯定我以前用過的負載/調用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,並且在我使用我的dll的32位版本時工作正常。
  3. 試圖明確地運行我的jar與32位java根本不工作。我的GUI不顯示並且命令提示符短暫地打開/關閉...
+0

你有幾個JRE/JDK的安裝。至少有一個32位和一個64位?如果是這樣,請檢查命令行中是否默認使用了另一個,而當您「雙擊jar」 – esej

+0

是的,我有一個x86和一個x64。當我從命令運行時,我絕對使用x64版本。我右鍵單擊我的jar圖標並將其設置爲使用x64 java打開,但我仍然遇到了dll問題。只是爲了踢我設置它打開與32位和CMD提示短暫打開和關閉 - 我的GUI永遠不會出現。 – Ben

+0

看起來問題的一部分已經解決了,剩下的就是windows的東西。但似乎你想要同時針對32位和64位系統,而你的dll是64位的 - 這個計劃是否有用? – esej

回答

0

問題2肯定是由運行32位JVM引起的。 Netbeans大概運行一個64位的JVM。您需要使用像Launch4j這樣的東西來加載正確的JVM(或者同時包含DLL的32位和64位版本)。

從命令行嘗試使用-d32和-d64來檢驗理論。

+0

-d64運行程序並加載了我的dll,但-d32說「錯誤:此Java實例不支持32位JVM」。另外,我通過右鍵單擊該jar並指定要使用哪個Java來早日檢查我正在使用正確的JVM。在netbeans中,我設置屬性來執行64位構建,所以我很困惑這將如何在32位JVM上打開。 – Ben

+0

我在上面的UPDATE部分中提到了一些更多的測試。你似乎是對的,但我仍然對發生了什麼感到困惑...... – Ben

+0

在你的機器上可能有3個完全獨立的java安裝。一個由Netbeans使用,一個由命令行使用,另一個由雙擊機器使用。每個可以是32,64或兩者,並且如果它們都具有不同的默認值。 –

0

您的計算機上是否安裝了多個Java版本?看起來,當你自己運行jar時,你的機器正在爲它創建一個32位的虛擬機。打開命令提示符並鍵入java -version以檢查正在使用哪個版本的Java。

+0

是的,我打算髮布32位和64位版本的程序(但是32位應該是x86不是IA 32)。 java -version說:「Java版本1.7.0,Java™SE運行時環境(build 1.7.0-b147),Java HotSpot™64位服務器VM(build 21.0-b17,混合模式)」,以及我不知道這意味着什麼...... – Ben