Juste emballer n'importe où dans le bocal. Une chose que vous devez garder à l'esprit que - avant vous pouvez utiliser la Dll, vous devez extraire ces du POT et de vidage de ces derniers sur le disque dur quelque part, sinon vous ne serez pas en mesure de charger ces
Donc, fondamentalement, - je n'ai JNI projet pour le client, je vais utiliser ces jar emballé dans la guerre. Cependant avant d'exécuter une des méthodes indigènes, je voudrais obtenir la DLL en tant que ressource et de l'écrire sur le disque dans le répertoire temp. Alors je voudrais exécuter régulièrement le code d'initialisation d'où ma DLL est défini de la même position que je viens d'écrire une DLL pour
Oh, et juste au cas où: il n'y a rien de spécial au sujet de l'emballage dll ou tout autre fichier dans le pot. C'est comme emballage des choses dans zip
Voici un code j'ai juste votés hors
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
}