DLLファイルを含むJARファイルを作成するには?
2023-09-26 15:30:52
質問内容
私は、JAR ファイルと 2 つの DLL ファイルを含むサードパーティの Java ライブラリを購入しました。私はサードパーティの JAR ファイルを呼び出す独自の Java プログラムを書きました。今、私の質問は次のとおりです。 どのように私はすべてのコードとサードパーティのJARとDLLを含む単一のJARファイルに私のコードをパッケージ化することができますか?
私は知っています。
SWT
はそのようなケースです。その
swt.jar
にはdllファイルが含まれていますが、どうすればいいのか、どうすれば正常に動作するのかがわかりません。
どのように解決するのですか?
jar の任意の場所にパッケージ化するだけです。DLL を使用する前に、実際に JAR から DLL を抽出し、ハード ディスク上のどこかに保存する必要があります。
基本的に、私はクライアントのために JNI プロジェクトを行い、戦争内にパッケージされたそのような jar を使用します。しかし、ネイティブ メソッドを実行する前に、私は DLL をリソースとして取得し、ディスクの temp ディレクトリに書き込みます。その後、私は通常の初期化コードを実行し、私の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
}
関連
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み] DLLとLIBファイル - 何が、なぜ?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Mavenプロジェクトにローカルのjarファイルを追加する方法は?
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み] コンパイル済み実行ファイルにDLLを埋め込む
-
[解決済み] Mavenでjarに依存関係を含める
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
Javaでよくある構文エラー
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
シェルコマンドやスクリプトのJavaコール
-
配列定数は初期化子でのみ使用可能です。
-
アノテーション「@Retention」の役割
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Java基礎 - マッピングとQ/A
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。