2

Firebirdが埋め込まれたJavaプロジェクトをエクスポートすると、コンソールに「java.library.pathにjaybird [22 [Any version、Iguess]]がありません」というメッセージが表示されます。

しかし、それは文字通り、私のワークスペースを自己参照する私のプロジェクトのライブラリパス上にあります。私は次のような多くの回避策を試しました

System.LoadFile("jaybird22.dll") //full uri, just the name of the dll, nada
System.Load("jaybird22.dll") //full uri, just the name of the dll, nada

または、dllをユーザーライブラリに挿入するか、dllを参照ライブラリとして別のフォルダに配置します。

それは本当に私を神経質にさせています。このエラーを回避するにはどうすればよいですか?JNI?

4

1 に答える 1

2

解決

わかりました、これがこの問題の解決策です。重要なのは、jar内には、dllも、ファイルを含むフォルダーもjarにパッケージ化されないということです。したがって、ほぼすべてのdll、画像を含むフォルダー、または実行可能なjarがある場所の隣のフォルダーにある必要があるものはすべてです。jarにパックされるのは、ソフトウェアを実行するための外部jarと.javaファイルだけです。

とにかく、Firebird埋め込みモードでは、かなり注意が必要です。jaybird(SOME_VERSION).dllは、すべての.dll、.msgファイルの隣に配置する必要があるためです。ただし、JVMは、jaybird dllがjava.library.pathにあることを要求します。もちろん、これはsystem32と、プログラムに関係のないいくつかのjavaフォルダーです。

したがって、プログラムで実行可能なjarフォルダーをjava.library.path(実際にはパスと呼ばれる必要があります)として検出するには、jaybirddllファイルとその他のfirebirdファイルおよびフォルダーをメインメソッドに配置します。

String decodedPath =URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8");
decodedPath=decodedPath.substring(1, decodedPath.length()-1).replaceAll("/", "\\\\");
System.setProperty("java.library.path",decodedPath+";"+System.getProperty("java.library.path")));

ライブラリパスの前のディレクトリをリストに追加するだけなので、これを同意します。

これらのLOCはANYCODEの前にある必要があり、コンストラクターの呼び出しも含まれることに注意してください。グローバル静的モジュールまたはJNI呼び出しを使用している場合は注意してください。

これが誰かの時間を節約することを願っています、私はこれを正しく理解しようとして私の仕事の12時間を失いました。

管理者が私の編集を消去しないか、この質問に自己回答していただければ幸いです。

ハッピーコーディング=D

于 2012-08-13T15:06:01.917 に答える