我如何可以加载在我的web应用程序自定义的dll文件? 我尝试以下方法,但它的失败。
- 复制所有需要的DLL
system32
文件夹,并试图加载它们中的一个Servlet
构造函数System.loadLibrary
- 在复制所需的DLL
tomcat_home/shared/lib
和tomcat_home/common/lib
- 所有这些DLL文件在
WEB-INF/lib
的web应用的
我如何可以加载在我的web应用程序自定义的dll文件? 我尝试以下方法,但它的失败。
system32
文件夹,并试图加载它们中的一个Servlet
构造函数System.loadLibrary
tomcat_home/shared/lib
和tomcat_home/common/lib
WEB-INF/lib
的web应用的 为了让System.loadLibrary()
工作,库(在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是不能够在你的应用程序的本地Java函数映射到其实际的天然对应。
首先,我会放一些记录在你System.loadLibrary()
调用,看看是否能正确执行。 如果它抛出一个异常或无法在实际执行的代码路径,那么你总是会得到后一种类型的UnsatisfiedLinkError
如上所述。
作为一个旁注,大多数人把自己loadLibrary()
调用到一个静态初始化块与本地方法,该类以确保它始终是执行一次:
class Foo {
static {
System.loadLibrary('foo');
}
public Foo() {
}
}
因为它是由JVM只读一次,在运行时更改“的java.library.path”变量是不够的。 你必须将其复位,如:
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会带你到一个解决方案,但如果你重新部署你的web应用(无需重新启动Web容器),你应该遇到以下错误:
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。 然而,你的web应用,现在一个新的类加载器运行,因为在同一个JVM运行和JVM不会允许2个引用同一个DLL,则无法重新装入 。 因此,你的web应用不能访问现有的DLL,不能加载一个新的。 所以....你就完蛋了。
Tomcat的类加载器的文件概述了为什么你的web应用重装上阵在一个新的独立的ClassLoader,以及如何可以解决此限制(在一个非常高的水平)运行。
解决的办法是延长亚当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) {
}
}
然后将含有此JUST编译的类进TOMCAT_HOME / lib文件夹一个罐子。
现在,你的web应用中,你只需要强制Tomcat来引用这个类,它可以简单地做,因为这:
Class.forName("awesome.Foo");
现在你的DLL应该在公共类加载器加载,并且可以从你的web应用,甚至重新调配后,被引用。
合理?
一个工作参考副本可以在谷歌代码,发现静态的dll引导程序 。
您可以使用System.load()
提供的绝对路径这是你想要的东西,而不是在标准库文件夹中的文件进行相应的操作系统。
如果你想已经存在的本地应用程序,使用System.loadLibrary(String filename)
。 如果你要提供你自己的,你很可能与负载更好的()。
你也应该能够使用loadLibrary
用java.library.path
正确设置。 见ClassLoader.java
用于示出被检查两个路径执行源(OpenJDK的)
在该问题是的System.loadLibrary无法找到有问题的DLL的情况下,一个常见的误解(通过Java的错误消息钢筋)是系统属性的java.library.path就是答案。 如果您设置系统属性的java.library.path到您的DLL所在的目录,然后将的System.loadLibrary确实找到你的DLL。 但是,如果你反过来DLL依赖于其他DLL,这是常有的情况下,那么的java.library.path不能帮助,因为依赖DLL加载是由操作系统,它什么都不知道java.library的完全管理。路径。 因此,它几乎总是更好地绕过的java.library.path白白LD_LIBRARY_PATH(Linux)上,DYLD_LIBRARY_PATH(MacOS的),或路径(Windows)中启动JVM之前添加DLL的目录。
(注:我使用的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
我正面临同样的异常; 我什么都试过,并使其发挥作用是重要的事情:
它的工作和Tomcat 6。
可怜的我 ! 花了整整一天的背后,如果任何机构复制这个问题this.Writing下来这里。
我试图加载亚当建议,但随后得到了与AMD64在任何情况下按照亚当(毫无疑问的最佳新秀)演练工作后陷入VS IA 32 exception.If,尝试有最新jre.Make的64位版本肯定你的JRE和JDK是64位的,你已经正确地把它添加到你的classpath。
我的工作示例放在这里: unstatisfied链接错误
如果你认为你添加的本地库的路径%PATH%,测试自己一个更多的时间:
的System.out.println(System.getProperty( “的java.library.path”))
它实际上应该告诉你,如果你的DLL是%PATH%
对于windows我发现,当我装的FILLES(jd2xsx.dll电话和ftd2xx.dll)到windowws / system32文件夹下该解决的问题。 然后我就与具有这就是为什么我必须加载这个DLL的旧版本参数做我的新fd2xx.dll的问题。 我必须在以后FERRIT了这一点。
注:jd2xsx.dll调用ftd2xx.dll所以只设置了jd2xx.dll可能无法正常工作的路径。
我使用的是Mac OS X Yosemite和Netbeans的8.02,我得到了同样的错误和简单的解决方案,我发现是像上面,当你需要在项目中包含本机库,这是有用的。 所以做下了Netbeans的:
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.library.path -它是什么以及如何使用
我有同样的问题,该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;
}
}