您的位置:首页 > 运维架构 > Tomcat

在tomcat下使用jni加载本地库的问题总结——处理UnsatisfiedLinkError错误

2014-07-12 16:22 344 查看
最近想使用ICTCLAS分词系统,需要在myeclipse中加载dll(本地库),查阅资料使用jni,ICTCLAS官方也提供了很全面的加载方法,虽然在run as java application下运行没有问题,但是在tomcat下报UnsatisfiedLinkError的错误,错误来自System.loadLibrary("ICTCLAS50"),是jni加载本地库的语句。

之前其实为了省事将dll放在根目录下,显然也不符合tomcat的要求,重新移动到webapps下,想将ICTCLAS.dll所在的目录添加到java.library.path中去:

[java] view plaincopy





<span style="font-size:14px;">String path = "";

try {

path = PublicMethod.getAbsolutePath()+"configure";

} catch (URISyntaxException e) {

e.printStackTrace();

}

path += System.getProperty("java.library.path");

System.setProperty("java.library.path", path);

// System.out.println(System.getProperty("java.library.path"));

System.loadLibrary("ICTCLAS50");</span>

同样报错,郁闷(后来得知想代码修改java.library.path是不可实现的 http://blog.csdn.net/xiaolang85/article/details/3604971

然后用过几个小方法,比如修改文件权限、修改路径斜杠。

大多数情况下tomcat的服务器都是租来的,所以涉及到你能否将你的dll放到tomcat的bin目录下面的问题,大多数情况下是不可能的。

最后用神奇的System.load(dll的绝地路径):

[java] view plaincopy





<span style="font-size:14px;">String path = "";

try {

path = PublicMethod.getAbsolutePath()+"configure";

} catch (URISyntaxException e) {

e.printStackTrace();

}

System.load(path+"/ICTCLAS50.dll");</span>

System.load()是加载dll的另一个方法,避免了查找java.library.path,注意此处的PublicMethod.getAbsolutePath()是自己写的一个获取tomcat运行目录的绝对路径的方法

值得一提的是如果你想加载jar包中的dll,可以参加以下代码:

[java] view plaincopy





try

{

//Finds a stream to the dll. Change path/class if necessary

InputStream inputStream = getClass().getResource("/jacob.dll").openStream();

//Change name if necessary

File temporaryDll = File.createTempFile("jacob", ".dll");

FileOutputStream outputStream = new FileOutputStream(temporaryDll);

byte[] array = new byte[8192];

for (int i = inputStream.read(array); i != -1; i = inputStream.read(array)) {

outputStream.write(array, 0, i);

}

outputStream.close();

temporaryDll.deleteOnExit();

System.load(temporaryDll.getPath());

return true;

}

catch(Throwable e)

{

e.printStackTrace();

return false;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐