0

exeインストーラーを介してJava3DAPIをPCにインストールしました。このインストーラーは、libサブディレクトリとbinサブディレクトリにj3dcore.jar、を使用して新しいディレクトリを作成するだけです。vecmath.jarj3dutils.jarj3dcore-ogl.dll

Netbeansには問題はなく、コードはスムーズにコンパイルおよび実行されましたが、プロジェクトをビルドしてコマンドプロンプトから実行しようとすると、次のように表示されましUnsatisfiedLinkErrorno j3dcore-ogl in java.library.path

グーグルが助けに来て、私に3つの実行可能な解決策を与えました:

  • dllファイルをJREのbinディレクトリにコピーします
  • dllファイルのパスをライブラリパスに追加する(java -Djava.library.path=dllpath
  • プログラムにdllをロードしますSystem.load()(実際には、これを機能させることができませんでした)

私の質問は:私が逃したこの問題に対するエレガントな解決策はありますか?

誰かがこのプログラムを使用したいPCごとに、実行する前にdllをコピーするか、ライブラリパスに追加する必要があるのは退屈なようです。(副次的な質問:なぜNetbeansはdllに問題がなかったのですか?)

4

4 に答える 4

1

Javaプログラムを簡単に配布できるようにする

「エンドユーザーにとって簡単」という意味の場合は、JavaWebStartを参照してください


通行人は尋ねます:

dllの依存関係をWebStartでパッケージ化できますか?

はい、しかしはるかに優れています。各プラットフォームのネイティブを別々のJarにパッケージ化し、ダウンロードをネイティブの32ビットバージョンと64ビットバージョンに分割する場合でも、そのネイティブを使用するプラットフォームにのみ提供できます。

JWSは、ネイティブをアプリケーションの実行時クラスパスに配置し、コードをロードできるようにします。

これはすべてエンドユーザーに対して自動的に行われ、リンクをクリックして、要求されたときに信頼ダイアログを承認します。アプリケーションは、おそらくデスクトップ統合でインストールされ、魔法のように画面に表示されます。

JWSアプリ。all-permissionsJVMは「ネイティブになる」もののアクションを保証できないため、ネイティブを使用するものはセキュリティレベルとして配布する必要があります。

于 2011-05-20T18:21:23.077 に答える
0

Jarと同じディレクトリにdllを配置した場合、それは機能しますか?はいの場合は、このように配布することを検討できます。

于 2011-05-20T15:17:14.947 に答える
0

DLLはWindowsの%PATH%のすべてのフォルダで検索されると思います。(UNIXフレーバーの場合はLD_LIBRARY_PATH)

dllへのパスを%path%変数に追加してみてください。

依存関係として多くのjarファイルを含む製品をパッケージ化しようとしているようです。あなたはOne-Jarの恩恵を受けるかもしれません 。ネイティブdllをサポートしているとのことです。

于 2011-05-20T17:50:39.057 に答える
0

編集-質問を読み直した後、問題は異なって聞こえます。ただし、Javaプロセスを開始する.batファイルと同じディレクトリにすべてのdllファイルをドロップするだけで、このように実行できます。

java -classpath ./YourJar.jar;./lib/j3dcore.jar;./lib/vecmath.jar;./lib/j3dutils.jar package.MainClass

そして、それは複数のユーザーのPCで機能するので、作業ディレクトリにドロップするだけで機能することを私は知っています。

使用しているJavaのバージョン(64ビットまたは32ビット)によって異なると思います。(同じ名前の)正しいdllファイルが作業ディレクトリにある必要があります。

間違ったdllが使用されていて、OSに依存しない場合にも同様の問題が発生したと思います(64ビットOSに32ビットJavaがインストールされている場合は、32ビットj3dcore-ogl.dllファイルが必要です)。

したがって、問題は、使用しているJavaのバージョン(IDEの外部で実行している場合)と、作業ディレクトリに配置しているdllのバージョン(存在する場合)です。これを他のPCで機能させるために、パス設定にdllファイルは必要ありません。また、System.load()を使用せず、ファイルをユーザーのJRE / binディレクトリにコピーしませんでした。したがって、これがなくても可能であることがわかります。あなたが言及する3つのオプション。

于 2011-06-17T02:07:29.390 に答える