封装DLL至jar包
dll一般在jar包外部调用,每个项目调用的人都需要loadLibrary,这样很麻烦,为了方便其他组调用dll,可以直接将dll封装至jar包,但是封装的时候由于loadLibrary需要以一个绝对路径,而dll由在jar内部,所以会导致报错,因此,可以考虑将dll从jar内部copy至运行缓存目录,或者用户主目录,然后再调用load方法,我将加载的方法写在interface的内部类的静态方法中,并且定义成员变量INSTANCE 用于接收内部类的静态方法实例化出来的接口实例。这样可以再加载类的时候就进行实例化,并且可以再实例化之前,先判断dll是否存在,如果不存在则从jar内部拷贝至指定目录。
public interface Geometric extends Library {
Geometric INSTANCE = GeometricFactory.newInstance();
int transformGeometry(byte[] geom, int length, double[] mat, byte[] resData, int[] resLen);
class GeometricFactory {
private GeometricFactory() {
}
public static Geometric newInstance() {
String tempDir = System.getProperty("java.io.tmpdir");
tempDir = tempDir.endsWith("\\") || tempDir.endsWith("/") ? tempDir : tempDir.concat("\\");
final File dllFile = new File(tempDir.concat("libs\\geometric\\x64\\Geometric.dll"));
if (!dllFile.exists()) {
final URL url = Geometric.class.getClassLoader().getResource("libs");
FileUtils.copyFromJar(url, "libs", tempDir);
}
final Geometric instance = (Geometric) Native.loadLibrary(tempDir
.concat("libs\\geometric\\x64\\Geometric.dll"), Geometric.class);
return instance;
}
}
}
拷贝jar内部文件夹及文件至指定目录代码如下:
public final class FileUtils {
private static final int TMP_LENGTH = 4096;
private FileUtils() {
}
public static void copyDir(final String sourcePath, final String newPath) {