在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;
}
之前其实为了省事将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;
}
相关文章推荐
- JVisualvm监控不到本地Tomcat问题总结和简单使用例子
- iOS9以下版本使用WKWebView加载本地HTML文件不显示,处理时容易忽略的问题
- JNI学习笔记5——本地方法处理java数组/引用问题/缓存jfieldID/jmethodID
- tomcat加载jsp的处理机制问题
- (原创)项目部署-Tomcat设置默认访问项目及项目重复加载问题处理
- 微信支付证书问题C#使用Https访问加载SSL证书本地调试正常服务器IIS内部错误解决方法
- AIX6.1 TL04下安装Oracle补丁时报java程序正在被使用问题处理总结
- 关于EASYUI使用dataGrid加载本地JSON文件浏览器不显示问题
- 使用Apache + mod_jk + tomcat来实现tomcat集群的负载均衡出现的无法加载mod_jk.conf文件的问题
- Nginx+Tomcat代理环境下JS无法完全加载问题的处理
- 使用JNI的struts2项目在tomcat遇到的问题
- 【总结】关于tomcat+6.0中使用连接池的问题
- android 针对于GridView中的getView方法的bug,使用本地缓存来处理图片显示的问题
- Tomcat 学习系列1 Tomcat8在win7下配置与使用 和常见问题处理
- 使用Pluto+Tomcat 开发遇到的问题和总结 (2)
- 【总结】关于tomcat+6.0中使用连接池的问题
- Tomcat设置默认访问项目及项目重复加载问题处理
- ubuntu下使用eclipse调试jni无法获取环境变量,本地库(java.library.path,LD_LIBRARY_PATH)等问题的解决。
- 有关使用Maven常见问题总结(Eclipse中使用Maven、Maven项目部署到tomcat等问题)
- Android Studio 1.01 使用 Git 总结及问题解决(需要在本地安装git )