问题描述
- dll等文件无法打入jar包,dll文件位置是相对路径
- 打包项目之后就调用不到dll文件
- 但是程序运行需要调用dll文件来完成功能
解决办法
将调用dll文件的方法由相对路径改为绝对路径
//例如调用海康摄像头中的一个地方
//官方给的HCNetSDK.java中使用的是相对路径,要求库文件都方法项目根目录下
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary( "HCNetSDK", HCNetSDK.class);
//改进:将库文件方法电脑任意位置的文件夹中(我放到桌面dll_library文件夹中)
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("C:\\Users\\esbk\\Desktop\\dll_library\\" + "HCNetSDK", HCNetSDK.class);
此时将项目打包后放任意位置通过 java -jar *.jar运行即可调用到dll文件
因为多处需要改相对路径为绝对路径,所以将这个地址提取到一个类中定义。在其他处引用即可。
public class DllLibraryPath {
/**
* PREFIX_DLL_PATH 是海康库文件在项目发布时所在电脑位置的绝对路径
*
* 例如下面的路径就是在我的桌面的 dll_library 文件夹中 存放库文件
*/
public static final String PREFIX_DLL_PATH = "C:\\Users\\esbk\\Desktop\\dll_library\\";
}
//替换
public interface HCNetSDK extends StdCallLibrary {
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(DllLibraryPath.PREFIX_DLL_PATH + "HCNetSDK", HCNetSDK.class);
}
2017/10/24 16点45分更新
上面在类中写死的方式,不利于打包发布.于是找到了另一种方式.更加灵活的设置
@Configuration
public class DllLibraryPath implements EnvironmentAware{
/**
* PREFIX_DLL_PATH
* 将海康头文件放到某个文件夹中,然后配置一个环境变量`HCSDK_HOME`(随意)
*
* spring-boot项目的话,实现`EnvironmentAware`接口重写setEnvironment方法
* environment.getProperty("HCSDK_HOME")来获取系统环境变量的值(海康头文件的位置)
*/
public static String PREFIX_DLL_PATH;
@Override
public void setEnvironment(Environment environment) {
PREFIX_DLL_PATH = environment.getProperty("HCSDK_HOME") + "\\";
}
}
这样的话,只需要配置指定的环境变量就可以了,头文件的位置可以灵活的设置.
注意:自定义环境变量配置之后需要重启电脑