DLL 파일을 포함하는 JAR 파일을 만드는 방법은 무엇입니까?
JAR 파일과 두 개의 DLL 파일이 포함 된 타사 Java 라이브러리를 구입했습니다. 타사 JAR 파일을 호출하는 자체 Java 프로그램을 작성했습니다. 이제 내 질문은 내 모든 코드와 타사 JAR 및 DLL을 포함하는 단일 JAR 파일로 모든 코드를 패키징하는 방법입니다.
나는 SWT 가 그런 경우 라는 것을 안다 . swt.jar
dll 파일 이 포함되어 있지만이 작업을 수행하는 방법과 제대로 작동하는 방법을 모르겠습니다.
항아리의 아무 곳에 나 포장하십시오. 하지만 명심해야 할 한 가지는 DLL을 사용하기 전에 실제로 JAR에서 이러한 DLL을 추출하여 하드 디스크 어딘가에 덤프해야합니다. 그렇지 않으면로드 할 수 없습니다.
그래서 기본적으로-전쟁에서 패키징 된 항아리를 사용할 클라이언트를 위해 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
}
무제한 중첩으로 다른 JAR에서 DLL 및 JAR을로드 할 수있는 http://www.jdotsoft.com/JarClassLoader.php 를 사용 하십시오 . 예를 들어 DLL은 다른 루트 JAR에있는 JAR에있을 수 있습니다. 모든 DLL 및 JAR은 클래스 경로 또는 라이브러리 경로에있는 것처럼로드됩니다.
참고URL : https://stackoverflow.com/questions/1611357/how-to-make-a-jar-file-that-includes-dll-files
'Program Tip' 카테고리의 다른 글
내 javascript / jquery 코드를 구성하는 방법은 무엇입니까? (0) | 2020.11.15 |
---|---|
RESTful API 문서화를위한 표준 방법 (0) | 2020.11.15 |
Qt가 예외 처리를 사용하지 않는 이유는 무엇입니까? (0) | 2020.11.15 |
치명적 : 'https://github.com'의 사용자 이름을 읽을 수 없음 : 해당 파일 또는 디렉터리가 없습니다. (0) | 2020.11.15 |
Webpack의 규칙 대 로더-차이점은 무엇입니까? (0) | 2020.11.15 |