java。郎。UnsatisfiedLinkError没有*****.dll。图书馆。路径
-
05-07-2019 - |
题
怎么我可以载有定义dll文件在我的网络应用程序?我试过以下方式,但它的失败。
- 复制所需的所有dll
system32
文件夹,并试图负荷之一,他们在Servlet
构造System.loadLibrary
- 复制所需的dll
tomcat_home/shared/lib
和tomcat_home/common/lib
- 所有这些dll在
WEB-INF/lib
该网络的应用程序
解决方案
为了 System.loadLibrary()
的工作,该图书馆(on Windows,DLL)必须在目录上的某个地方你 PATH
或 在中列出的路径 java.library.path
系统属性(因此可以启动Java喜欢 java -Djava.library.path=/path/to/dir
).
此外,对于 loadLibrary()
, 你指定的座的名字图书馆,而不 .dll
在结束。因此,对于 /path/to/something.dll
, 你只会用 System.loadLibrary("something")
.
你还需要看看确切的 UnsatisfiedLinkError
那你得到。如果说是这样的:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path
然后它无法找到的 foo 库(foo.dll)在您的 PATH
或 java.library.path
.如果说是这样的:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V
然后事情是错误的,与图书馆本身在这个意义上,是不够的地图一个地Java功能的应用程序中的其实际实地对应。
开始,我会把一些记录周围你 System.loadLibrary()
叫来看看如果执行得当。如果它引发了一个异常或不在一个码的路径,是实际执行,然后你总是会得到后一种类型的 UnsatisfiedLinkError
上面所解释的。
作为一个旁注,大多数人把他们的 loadLibrary()
调入一个静态的初始化框在类与本地的方法,以确保它始终是执行的一次:
class Foo {
static {
System.loadLibrary('foo');
}
public Foo() {
}
}
其他提示
改变'java。图书馆。路'可变运行时是不够的,因为它是只读一旦通过JVM。你要重设这样的:
System.setProperty("java.library.path", path);
//set sys_paths to null
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
请采取一个战利品: 改变Java路径图书馆在运行时.
原来的答案通过亚当Batkin会带你到一个解决方案,但如果重新部署网络应用程序(而不重新启动您的网的容器),则应运入以下错误:
java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
at java.lang.Runtime.load0(Runtime.java:787)
at java.lang.System.load(System.java:1022)
发生这种情况,因为这类装入器,最初装载DLL仍然引用这DLL。然而,你的网络应用程序现在正在运行一个新的类装入器,因为同样的JVM运行和JVM不会允许2提到的相同的问题,你不能 重新加载 它。因此,你的网络应用程序无法获取现有DLL并不能负载一个新。所以...你就完蛋了。
Tomcat的类加载文档 概述了为什么你重新装载,网络应用程序运行在一个新的孤立的类装载器以及如何可以解决这个限制(在一个非常高的水平)。
该方案被延长Adam Batkin的解决方案的一点点:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
然后把罐子只包含这个编译流入TOMCAT_HOME/lib文件夹。
现在,在你的网络应用程序的,你只需要力Tomcat以参考这一类,这可以作为只是作为这样的:
Class.forName("awesome.Foo");
现在你DLL应当装载在公共类装入器,并且可以引用你的网络应用程序后,即使正在重新部署。
有意义吗?
一个工作参照的副本,可以发现在谷歌码, 静-dll引导程序 .
你可以使用 System.load()
提供一个绝对的道路,这是你想要什么,而不是一个文件在标准图书馆的文件夹,用于各自的操作系统。
如果你想要的本地应用程序已经存在,使用 System.loadLibrary(String filename)
.如果你想提供你自己你可能更好地与负载().
你也应该能够使用 loadLibrary
与 java.library.path
设置正确。看看 ClassLoader.java
为执行源显示这两个路径正在检查(们可根据最新的技术提供一些)
在这种情况下那里的问题是系统。loadLibrary找不到DLL在的问题,一个常见的误解(加强Java的错误信息)是系统性java。图书馆。路径是答案。如果你设置的系统性java。图书馆。路径向目录DLL的位置,然后系统。loadLibrary会的确找到你的DLL。但是,如果你DLL又取决于其他Dll,因为往往是这种情况,那么java。图书馆。道路无法帮助,因为载入的依赖Dll管理完全由的操作系统,该系统什么都不知道。图书馆。路径。因此,它几乎总是更好的绕过java。图书馆。路径而简单地添加DLL's directory LD_LIBRARY_PATH(Linux),DYLD_LIBRARY_PATH(mac os),或路径(Windows)之前开始的JVM。
(注:我使用的术语"DLL"在通用意义上的DLL或共用图书馆。)
如果你需要载入一个文件,该文件是相对于一些目录,你已经被(如在目前的目录),这是一个简单的解决方案:
File f;
if (System.getProperty("sun.arch.data.model").equals("32")) {
// 32-bit JVM
f = new File("mylibfile32.so");
} else {
// 64-bit JVM
f = new File("mylibfile64.so");
}
System.load(f.getAbsolutePath());
对于那些正在寻找 java.lang.UnsatisfiedLinkError: no pdf_java in java.library.path
我是面临相同的异常;我尝试了一切和重要的事情,以使它的工作是:
- 正确版本的pdf lib.jar (在我的情况下,这是错误的罐子版本保存在服务器运行时)
- 做一个文件夹和保持pdflib罐子它并添加的文件夹在你的路径变
它的工作与tomcat6.
可怜我!花了一整天的时间。把它写下来在这里,如果任何体重复了这个问题。
我是试图负载正如亚当建议,但后来被抓住了与AMD64vs IA32例外。如果在任何情况下,工作后每亚当(没有怀疑的最好的选择)演练,尝试有64位版的最新java运行环境.确保你的java运行环境和JAVA64点,你必须正确地添加到类路径。
我的工作的例子在这里:unstatisfied链接的错误
如果你认为你增加了一个路径的原lib%的道路%,测试自己更多的时间:
系统。出。释放(系统。getProperty("java。图书馆。路径"))
它应该告诉你其实如果你dll上%的道路%
- 做重新启动IDE的想法,是的,它的出现为我工作之后,我设立了环境的变量,将它添加到%的道路%
Windows我发现,当我加载的filles(jd2xsx.dll 电话ftd2xx.dll)进入windowws/system32folder这种解决的问题。然后,我有一个问题,与我的新fd2xx.dll 具有与参数这就是为什么我已经加载了旧版本的这dll。我会有铁氧体此后。
注:的jd2xsx.dll 呼叫的ftd2xx.dll 所以只有设置的路径jd2xx.dll 可能不起作用。
我使用的是Mac OS X约塞米蒂和//需要将物品寄8.02,我得到了同样的错误和简单的解决方案,我们发现就像是上文所述,这是有用的,当你需要包括本地图书馆项目。这样做下一个象偷:
1.- Right click on the Project
2.- Properties
3.- Click on RUN
4.- VM Options: java -Djava.library.path="your_path"
5.- for example in my case: java -Djava.library.path=</Users/Lexynux/NetBeansProjects/NAO/libs>
6.- Ok
我希望这可能是有用的人。链接在那里我找到了解决办法是在这里:java。图书馆。路径–它是什么和如何使用
我有同样的问题和错误,是由于重新命名的dll。它可能发生,图书馆的名字也写里面的某个地方dll。当我放回其原来的名字我能够负荷使用 System.loadLibrary
This is My java.library.path:
java.library.path = C:\Program Files\Java\jdk1.7.0_51\bin
C:\WINDOWS\Sun\Java\bin
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\system32
C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\lib\idrskr
.lib
C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSG
idgeDll.dll
C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSG
aderDll.dll
C:\Program Files\Java\jdk1.7.0_51\bin
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0
C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\
C:\Program Files\Microsoft SQL Server\100\DTS\Binn
Still rror comes:
infile >> D:\pdf_upload\pre_idrs15_win_temporary_license_activation_tutorial.pdf
outFile >> D:\pdf_upload\processed\pre_idrs15_win_temporary_license_activation_tutorial.txt
Hello : This is java library path:(NICKRJ) C:\Program Files\Java\jdk1.7.0_51\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jdk1.7.0_51/jre/bin/server;C:/Program Files/Java/jdk1.7.0_51/jre/bin;C:/Program Files/Java/jdk1.7.0_51/jre/lib/amd64;C:\WINDOWS\system32;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\lib\idrskrn15.lib;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSGEBridgeDll.dll;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSGEReaderDll.dll;C:\Program Files\Java\jdk1.7.0_51\bin;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn;D:\WorkSet\New folder\eclipse_kepler\eclipse;;.
Exception in thread "main" java.lang.UnsatisfiedLinkError: no iDRMSGEBridgeDll in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at com.bi.iDRMSGEBridgeDll.callOcr(iDRMSGEBridgeDll.java:78)
at com.bi.iDRMSGEBridgeDll.main(iDRMSGEBridgeDll.java:15)
Here is my Java JNI class:
package com.bi;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
public class iDRMSGEBridgeDll
{
public native int iDRMSGEDll_Initialize(String strPropertiesFileName);
public native int iDRMSGEDll_VerifyLicense();
public native int iDRMSGEDll_ConvertFile(String strSourceFileName, String srcOutputFileName, String formatType);
public native int iDRMSGEDll_Finalize();
public static void main(String[] args)
{
//iDRMSGEBridgeDll.callOcr("bgimage.jpg","jpg","","d:\\","d:\\","4");
iDRMSGEBridgeDll.callOcr("pre_idrs15_win_temporary_license_activation_tutorial.pdf","pdf","","D:\\pdf_upload","D:\\pdf_upload\\processed","4");
/* System.loadLibrary("iDRMSGEBridgeDll");
iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll();
if ( obj.iDRMSGEDll_Initialize("D:\\iris\\iDRSGEDll.properties") != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_Initialize success.");
if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_VerifyLicense success.");
if (obj.iDRMSGEDll_ConvertFile("E:\\UI changes File_by Shakti\\PDF\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].pdf",
"E:\\SK_Converted_Files\\MVP_CONTRACTS\\Southwest CFM56-7\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1]\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].txt", "4" ) != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_ConvertFile 1 success.");
/*if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.pdf",
"C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.out", 4) != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_ConvertFile 2 success.");
if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.pdf",
"C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.out", 4) != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_ConvertFile 3 success.");
if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.pdf",
"C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.out", 4) != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_ConvertFile 4 success.");
obj.iDRMSGEDll_Finalize();
System.out.println("iDRMSGEDll_Finalize success.");
return;*/
}
public static String callOcr(String inputFile, String docType, String engineType, String filePath,String outputFolder,String type) throws RuntimeException
{
String message = "";
String formatType = type;
String inFile = filePath +"\\" +inputFile;
String outFile="";
if(type.equals("4"))
outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".txt";
else if(type.equals("6"))
outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".rtf";
else if(type.equals("9"))
outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".pdf";
else
outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".csv";
System.out.println("infile >> "+inFile);
System.out.println("outFile >> "+outFile);
System.out.println("Hello : This is java library path:(NICKRJ) " +System.getProperty("java.library.path"));
System.loadLibrary("iDRMSGEBridgeDll");
//System.load("C:\\Program Files (x86)\\I.R.I.S. SA\\iDRS_15_2_for_Win64_15_2_11_1717\bin\\iDRMSGEBridgeDll.dll");
//Runtime.getRuntime().loadLibrary("iDRMSGEBridgeDll");
iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll();
try
{
if ( obj.iDRMSGEDll_Initialize("D:\\IRIS\\iDRSGEDll.properties") != 0 ) {
obj.iDRMSGEDll_Finalize();
// return ;
}
System.out.println("iDRMSGEDll_Initialize success.");
if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) {
obj.iDRMSGEDll_Finalize();
// return;
}
System.out.println("iDRMSGEDll_VerifyLicense success.");
// formatType= JOptionPane.showInputDialog("Please input mark format type: ");
if (formatType!=null && formatType.equals("4")) {
obj.iDRMSGEDll_ConvertFile(inFile,
outFile, "4" );
obj.iDRMSGEDll_Finalize();
// return;
}
else if(formatType!=null && formatType.equals("6")) {
obj.iDRMSGEDll_ConvertFile(inFile,
outFile, "6" );
obj.iDRMSGEDll_Finalize();
// return;
}
else if(formatType!=null && formatType.equals("7")) {
obj.iDRMSGEDll_ConvertFile(inFile,
outFile, "7" );
obj.iDRMSGEDll_Finalize();
// return;
}
else if(formatType!=null && formatType.equals("9")) {
obj.iDRMSGEDll_ConvertFile(inFile,
outFile, "9" );
obj.iDRMSGEDll_Finalize();
// return;
}
else
{
message= "iDRMSGEDll_VerifyLicense failure";
}
System.out.println("iDRMSGEDll_ConvertFile 1 success.");
/*if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.pdf",
"C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.out", 4) != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_ConvertFile 2 success.");
if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.pdf",
"C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.out", 4) != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_ConvertFile 3 success.");
if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.pdf",
"C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.out", 4) != 0 ) {
obj.iDRMSGEDll_Finalize();
return;
}
System.out.println("iDRMSGEDll_ConvertFile 4 success.");*/
obj.iDRMSGEDll_Finalize();
System.out.println("iDRMSGEDll_Finalize success.");
if(message.length()==0)
{
message = "success";
}
}
catch(Exception e)
{
e.printStackTrace();
message = e.getMessage();
}
return message;
}
}