把它装在罐子里的任何地方。但是,您必须记住一件事-在使用DLL之前,您需要实际从JAR中提取这些DLL,并将它们转储到某个硬盘上,否则您将无法加载这些DLL。
因此,基本上-我为客户做了JNI项目,在那里我将使用这样的JAR包装在战争中。但是-在运行任何本机方法之前,我会将DLL作为资源并将其写入磁盘到临时目录中。然后,我将运行常规初始化代码,其中我的dll被设置为与刚才写入dll的位置相同的位置。
哦,以防万一:将DLL或任何其他文件打包到JAR中没有什么特别之处。就像把东西装进拉链
这是我刚挖出来的一些代码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}