質問

JARファイルと2つのDLLファイルを含むサードパーティのJavaライブラリを購入しました。サードパーティのJARファイルを呼び出す独自のJavaプログラムを作成しました。ここで私の質問は、すべてのコードと、すべてのコードとサードパーティのJARおよびDLLを含む単一のJARファイルにパッケージ化するにはどうすればよいですか

私は SWT がそのような場合であることを知っています。 swt.jar にはdllファイルが含まれていますが、これを行う方法と適切に機能させる方法はわかりません。

役に立ちましたか?

解決

jarの任意の場所にパッケージ化します。ただし、DLLを使用する前に、JARからこれらを実際に抽出し、ハードディスクのどこかにダンプする必要があります。そうしないと、ロードできません

基本的に-私は戦争のためにパッケージ化されたそのようなjarを使用するクライアントのためにJNIプロジェクトを行いました。ただし、ネイティブメソッドを実行する前に、DLLをリソースとして取得し、ディスクに一時ディレクトリに書き込みます。次に、DLLを作成した場所と同じ場所にDLLが設定されている通常の初期化コードを実行します

ああ、念のため:dllやその他のファイルをjarにパッケージ化することについて特別なことはありません。アイテムをzipにパッケージ化するようなものです

ここで私が掘り出したコードをいくつか示します

public class Foo {
private static final String LIB_BIN = "/lib-bin/";
private final static Log logger = LogFactory.getLog(ACWrapper.class);
private final static String ACWRAPPER = "acwrapper";
private final static String AAMAPI = "aamapi51";
private final static String LIBEAU = "libeay32";

static {
    logger.info("Loading DLL");
    try {
        System.loadLibrary(ACWRAPPER);
        logger.info("DLL is loaded from memory");
    } catch (UnsatisfiedLinkError e) {
        loadFromJar();
    }
}

/**
 * When packaged into JAR extracts DLLs, places these into
 */
private static void loadFromJar() {
    // we need to put both DLLs to temp dir
    String path = "AC_" + new Date().getTime();
    loadLib(path, ACWRAPPER);
    loadLib(path, AAMAPI);
    loadLib(path, LIBEAU);
}

/**
 * Puts library to temp dir and loads to memory
 */
private static void loadLib(String path, String name) {
    name = name + ".dll";
    try {
        // have to use a stream
        InputStream in = ACWrapper.class.getResourceAsStream(LIB_BIN + name);
        // always write to different location
        File fileOut = new File(System.getProperty("java.io.tmpdir") + "/" + path + LIB_BIN + name);
        logger.info("Writing dll to: " + fileOut.getAbsolutePath());
        OutputStream out = FileUtils.openOutputStream(fileOut);
        IOUtils.copy(in, out);
        in.close();
        out.close();
        System.load(fileOut.toString());
    } catch (Exception e) {
        throw new ACCoreException("Failed to load required DLL", e);
    }
}
    // blah-blah - more stuff
}

他のヒント

DLLをロードできる http://www.jdotsoft.com/JarClassLoader.php を使用しますおよび無制限のネストを持つ別のJARからのJAR。たとえば、DLLは別のルートJARにあるJARにあります。すべてのDLLとJARは、クラスパスまたはライブラリパスにあるようにロードされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top