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

本文介绍了在Tomcat环境中使用JNI加载本地库时遇到的UnsatisfiedLinkError问题及解决方案。尝试将DLL放入webapps目录,并修改java.library.path未成功。由于无法直接修改系统路径,通过System.load()方法指定dll的绝对路径解决了问题。此外,还提及了从jar包中加载dll的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

<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.youkuaiyun.com/xiaolang85/article/details/3604971 )

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

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

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

<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,可以参加以下代码:

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; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值