5

依存している 2 つの .dll ファイルを持つ .jar があります。実行時にこれらのファイルを .jar 内からユーザーの一時フォルダーにコピーする方法があるかどうかを知りたいです。これが私が持っている現在のコードです(質問のサイズを減らすために.dllを1つだけロードするように編集しました):

public String tempDir = System.getProperty("java.io.tmpdir");
public String workingDir = dllInstall.class.getProtectionDomain().getCodeSource().getLocation().getPath();

public boolean installDLL() throws UnsupportedEncodingException {

try {
             String decodedPath = URLDecoder.decode(workingDir, "UTF-8");
             InputStream fileInStream = null;
             OutputStream fileOutStream = null;

             File fileIn = new File(decodedPath + "\\loadAtRuntime.dll");
             File fileOut = new File(tempDir + "loadAtRuntime.dll");

             fileInStream = new FileInputStream(fileIn);
             fileOutStream = new FileOutputStream(fileOut);

             byte[] bufferJNI = new byte[8192000013370000];
             int lengthFileIn;

             while ((lengthFileIn = fileInStream.read(bufferJNI)) > 0) {
                fileOutStream.write(bufferJNI, 0, lengthFileIn);
             }

            //close all steams
        } catch (IOException e) {
      e.printStackTrace();
             return false;
        } catch (UnsupportedEncodingException e) {
             System.out.println(e);
              return false;
        }

私の主な問題は、実行時に .dll ファイルを jar から取り出すことです。.jar 内からパスを取得する方法は役に立ちます。

前もって感謝します。

4

3 に答える 3

8

dll は jar ファイル内にバンドルされているため、 ClassLoader#getResourceAsStreamを使用してそれらをリソースとして acasses し、ハード ドライブ上の任意の場所にバイナリ ファイルとして書き込むことができます。

サンプルコードは次のとおりです。

InputStream ddlStream = <SomeClassInsideTheSameJar>.class
    .getClassLoader().getResourceAsStream("some/pack/age/somelib.dll");

try (FileOutputStream fos = new FileOutputStream("somelib.dll");){
    byte[] buf = new byte[2048];
    int r;
    while(-1 != (r = ddlStream.read(buf))) {
        fos.write(buf, 0, r);
    }
}

上記のコードは、パッケージ内にある dllsome.pack.ageを現在の作業ディレクトリに抽出します。

于 2013-07-19T12:16:24.577 に答える
0

この JAR ファイル内のリソースを見つけることができるクラス ローダーを使用します。Peter Lawrey が提案したように、クラスのクラス ローダーを使用するか、URLClassLoaderその JAR への URL を使用して を作成することもできます。

そのクラスローダーを取得したら、 でバイト入力ストリームを取得できますClassLoader.getResourceAsStream。一方、作成しFileOutputStreamたいファイルの を作成するだけです。

最後のステップは、コード例で既に行ったように、入力ストリームから出力ストリームにすべてのバイトをコピーすることです。

于 2013-07-19T12:32:23.423 に答える
0

を使用するmyClass.getClassLoader().getResourceAsStream("loadAtRuntime.dll");と、JAR 内の DLL を見つけてコピーできるようになります。同じ JAR にもあるクラスを選択する必要があります。

于 2013-07-19T12:16:20.523 に答える