Java调用dll的路径问题解决
前言:一般我们在用java写jni类库的时候,总是得把生成的dll放在java.library.path所指定的目录下,例如%WINDOWS%\system32,然而通过手动设置setProperties("java.library.path",yourpath),并不能正常使用。所以只能在项目的发布期间拷贝才能正常使用,非常麻烦,有时因经常变动,还会忘记拷贝,导致程序出现错误。笔者在经过网上的搜索,加上自己的实践,找到不用拷贝dll,也可以动态加载的方式,以此备注。原理:由于ClassLoader里加载环境变量是只初始化一次,所以在此以后的所有设置将不起作用。看了网上一篇文章,原来可以读dll文件,并把它写到java.library.path的目录下,并通过System.load()进行动态加载,就可以实现不用拷贝也可以实现。代码示例://注:ConvertWord2HM是我的类名称
????private static void setLibrary() {
??try {?
????????String libFileName = "Convert.dll";//dll 文件
????????//获取到java.library.path
??????????String libpath = System.getProperty("java.library.path");???
??????????if ( libpath==null || libpath.length() == 0 ) {???
??????????????throw new RuntimeException("java.library.path is null");???
??????????}???
?????????????????
??????????String path = null;???
??????????StringTokenizer st = new StringTokenizer(libpath, System.getProperty("path.separator"));???
??????????if ( st.hasMoreElements() ) {???
??????????????path = st.nextToken();???
??????????} else {???
??????????????throw new RuntimeException("can not split library path:" + libpath);???
??????????}???
??????????//把dll文件写入到java.library.path中该dll放在ConvertWord2HM相同目录下,这个可以是你的类名
??????????InputStream inputStream = ConvertWord2HM.class.getResource(libFileName).openStream();???
??????????final File dllFile = new File(new File(path), libFileName);???
??????????if (!dllFile.exists()) {???
??????????????FileOutputStream outputStream = new FileOutputStream(dllFile);???
??????????????byte[] array = new byte[8192];???
??????????????int bytesRead = -1;
?????while(bytesRead = inputStream.read(array)!=-1){
??????outputStream.write(array,0,bytesRead);
?????}??
?????outputStream.flush();
??????????????outputStream.close();???
??????????}
??????????//动态加载dll
??????????System.load(dllFile.getPath());
?????????
??????????//在虚拟机关闭的时候删除dll
??????????dllFile.deleteOnExit();
??????
??????} catch (Throwable e) {???
??????????????throw new RuntimeException("load Convert.dll error!", e);???
???}
????}???你可以把它放在static块中,这样只需加载一次。方便以后的使用。