0

だから私は、usb-hidデバイスへのアクセスを提供する私が書いたjni .dll(私は適切にjniusbと名付けました)を使用するJavaのこのプロジェクトを持っています。昨日、netbeansから直接ではなく、jarからプログラムを起動しようとしたときまで、特に問題なく数か月使用しています。少しデバッグした後、私は自分の問題を次のように特徴付けました:

  1. jarアイコンをクリックすると、dllをロードせずにプログラムが起動します。自分のdllをjavabinariesフォルダー(以前は常に機能していたようです)にコピーしたにもかかわらず、GUIにエラーメッセージを表示すると、「java.library.pathにjniusbがありません」と表示されました。

  2. コードを微調整して現在のディレクトリを見つけ、「System.loadLibrary」の代わりに「System.load」(dllをjarと同じフォルダにコピー)を使用しました。このアプローチでは、「C:\ Users \ bpaik \ Documents \ NetBeansProjects \ JniUsb \ dist \ jniusb.dll:IA32ビットプラットフォームにAMD64ビット.dllを読み込めません」というエラーが発生しました。私はAMD64ビットプラットフォームで最も確実に作業しており、NetBeansが不足すると同じdllで動作するため、これで頭を悩ませました...

  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ライブラリで構築されており、コマンドプロンプトから起動するとx64dllで正常に実行されます。
  2. アイコンからjarを起動すると(デフォルトのプログラムはx64 javaに設定されています)、プログラムとJVMはどういうわけか32ビットJVMに切り替わり、32ビットバージョンのdllを使用すると正常に動作します。
  3. 32ビットJavaでjarを明示的に実行しようとしても、まったく機能しません。GUIが表示されず、コマンドプロンプトが短時間開いたり閉じたりします...
4

2 に答える 2

0

マシンに複数のバージョンの Java がインストールされていますか? jar を単独で実行すると、マシンが 32 ビット VM を作成しているように見えます。コマンド プロンプトを開いて入力し、java -version使用されている Java のバージョンを確認します。

于 2012-05-25T17:58:28.330 に答える
0

問題 2 は、32 ビット JVM を実行していることが原因であることは間違いありません。Netbeans はおそらく 64 ビット JVM を実行します。適切な JVM をロードするには、Launch4j などを使用する必要があります (または、DLL の 32 ビット バージョンと 64 ビット バージョンの両方を含めます)。

コマンドラインから -d32 と -d64 を試して、その理論をテストしてください。

于 2012-05-25T18:00:42.757 に答える