java动态加载dll文件

来源:互联网 发布:淘宝忘记密码修改密码 编辑:程序博客网 时间:2024/05/22 15:33
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);//加载本地资源

}

原创粉丝点击