java动态加载dll文件

1、java工程加载JNI文件
* 过程:在项目中加入JNI(.dll)文件和对应的java类文件,选择build path->Source->Native library location->edit->选择.dll文件位置。

* 错误:
(1)加载dll文件错误,未报错,但方法执行失败,这是dll文件位置错误,应该放到项目目录下。
(2)加载dll错误,jdk位数与dll文件生成位数不一致。
2、web工程加载JNI文件
* 将dll文件放在WEB-INF目录下
* 使用监听类listener.LoadListener.java加载动态资源文件。
注意:在加载过程中,要加载所有相关的dll文件。
public void contextInitialized(ServletContextEvent arg0) {
		//获取存放dll文件的绝对路径(假设将dll文件放在系统根目录下的WEB-INF文件夹中)  
       		 String path=arg0.getServletContext().getRealPath("WEB-INF");  
        	//将此目录添加到系统环境变量中   
        	addDirToPath(path);  
        	//加载相应的dll/so文件,注意要将'\'替换为'/'   
        	System.load(path.replaceAll("\\\\","/")+"/UHFReader288.dll"); 
        	System.load(path.replaceAll("\\\\","/")+"/com_rfid_uhf288_Device.dll");  
	}
	private void addDirToPath(String s) {
		try{
		//获取系统path变量对象  
	        Field field=ClassLoader.class.getDeclaredField("sys_paths");  
	        //设置此变量对象可访问   
	        field.setAccessible(true);  
	        //获取此变量对象的值   
	        String[] path=(String[])field.get(null);  
	        //创建字符串数组,在原来的数组长度上增加一个,用于存放增加的目录  
	        String[] tem=new String[path.length+1];  
	        //将原来的path变量复制到tem中   
	        System.arraycopy(path,0,tem,0,path.length);  
	        //将增加的目录存入新的变量数组中   
	        tem[path.length]=s;  
	        //将增加目录后的数组赋给path变量对象  
	        field.set(null,tem);  
	    } catch (Exception e) {  
	        e.printStackTrace();  
	    }  
	}


* 导入与动态资源文件相关的类。

注意:导入类的包名不可以变。

3、JNA动态加载使用路径:

* 在java项目中加载dll文件,文件存在lib目录下

public interface HCNetSDK extends StdCallLibrary {
   HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("../lib/HCNetSDK",HCNetSDK.class);

。。。

}

* 在web项目中加载dll文件,文件存在classes目录下:

public interface HCNetSDK extends StdCallLibrary {

// 获取本地资源路径,replace("%20", " ")替换路径中的空格

String path = HCNetSDK.class.getResource("/").getPath().substring(1).replace("/", "\\").replace("%20", " ");
    HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path+"HCNetSDK",HCNetSDK.class);//加载本地资源

}


版权声明:本文为fatniuo_o原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。