ldlibrarypath(如何解决java调dll报Unable to load library的错误)
大家好,今天小编来为大家解答ldlibrarypath这个问题,如何解决java调dll报Unable to load library的错误很多人还不知道,现在让我们一起来看看吧!
如何解决java调dll报Unable to load library的错误
解决java调dll报Unable to load library的错误可以尝试以下方法:
载入库文件有两个函数,System.load和 System.loadLibrary。
当使用System.load时,需要输入文件的全路径,例如:System.load(“/tmp/test.so”);
当使用System.loadlibrary时是在系统的library的目录中需找复合条件的库文件,可以使用-Djava.library.path=[path]参数,来指定Java程序加载库文件的路径,或者将库文件(*.so,*.dll)复制到include的默认路径,Linux一般是/usr/lib目录下,当然你可以编辑/etc/ld.so.conf.d/下的文件,设定自己的库查找路径ldconfig-v|grep xxx看看有没有你的动态库。
Linux还要注意,使用System.loadLibrary(name)方法其中参数内容与Windows有区别,Linux中的的库文件名为libname.so,Windows为name.dll。
在Windows中尽量使用Windows的C/C++编译器生成dll文件,否则会出现问题。
不过具体问题还要具体对待!
如何解决no jzmq in java.library.path
DLL默认是读取Windows环境变量%PATH%,Linux也有一个LD开头的变量(忘记叫什么名字)。而我们随时可以通过-Djava.library.path=定制我们的loadlibrary路径搜索列表。把你的dll复制到到处都是不是一个推荐的方法,这会导致当我们有多个版本时出错或你换了版本时不知道具体有多少个地方未忘记替换,正确的方法是让-Djava.library.path中包括你的目录,这便于集中管理。另外作为native程序(VC,VB之类的非虚拟机程序)它们默认会把当前目录作为搜索目录,记住Java不会默认把当前目录当作搜索目录,如果你偶然发现是这样的那是因为环境变量CLASSPATH或PATH中包括了一个"."在里面,而这个”."是安装JRE时自动添加或你手工添加的,有些程序的bat批处理文件中使用当前目录,但当我们在bat中通过cd命令改变了当前目录时我们再用”重启“的功能再启动命令行时我们就应该小心留言到这个当前目录已经变化了。另外JavaBuildPath(Java构建路径)下添加jar包这个过程本身只是为”Build"构建准备的,当我们在“Run"运行的时候是不相关的(只是Eclipse会自动把JavaBuildPath转换在运行一个mainclass时的classpath,当我们手工运行mainclass命令行时我们还是得自己添加classpath,因此始终明白这个JavaBuildPath并不一定能解决Run的问题)。
如何在linux下调试Java system.loadlibrary错误
1.我认为这个问题是与调用System.loadLibrary(字符串)LD_LIBRARY_PATH。使用LoadLibrary(“富”)将看着你的java.library.path的libfoo.so。如果发现任何libfoo.so你会得到这个错误。现在,如果你只设置了LD_LIBRARY_PATH,你想要的原始符号将自动被拾起的连接器,所以你不需要设置-Djava.library.path。在我的经验与swig在GDAL项目,这个错误其实是无害的,因为LD_LIBRARY_PATH设置,这将正常工作。我会使用-Djava.library.path和调用调用LoadLibrary explitly CodeGo.net,原因是,如果你决定要使用的webstart部署你的应用程序,你将需要显式地调用LoadLibrary来让你的本地库拾起。当月食我遵循达夫给您编辑在构建路径Libraries选项卡下的jar本地库的说明。只需再次,这只是设置在幕后java.library.path。
2.你可以试试-Djava.library.path=actual.so行吧?在Windows上,我也有类似的问题,第三方库,JNI封装的DLL,它的DLL。我的项目已经在lib目录下的DLL,这样我添加到库的路径(如:PATH=%PATH%;./lib变,一切都开始工作。
3.据我知道的Eclipse没有关系'的LD_LIBRARY_PATH。要树立正确的本地库路径的最简单的方法就是去项目属性-> Java构建路径->库然后展开或者JRE的系统库条目或(如果有的话)的 jar文件的本地库,选择“本地库位置”,然后单击“编辑...”并选择你的库。实际上它并设置-Djava.library.path变量,以便你必须包括这行,如果你开始从外面蚀你的程序的文件夹。
4.这可能是因为你只需要找到运行配置对话框中合适的地方放-Djava.library.path=...选项。随口说说我想你想-D在选项卡上的“VM定义,而如果要定义LD_LIBRARY_PATH就是那张在标签上。Eclipse的让你把东西在那里他们赢得'你觉得什么反正我库这样的地方以前,如果我有机会,我会仰望我做了什么,在这里编辑我的答案。另一件事,试图与LD_DEBUG玩。您可以设置变量LD_DEBUG的事情(尝试所有),然后Linux加载程序会泄露的各种关于什么一个应用程序试图加载,它在寻找的东西,等等。当然,这种预先假定您启动Eclipse从行,所以你可以同时设置ENV增值经销商,看到了loader的诊断,但就系统而言,当你从Eclipse中运行你的应用,你的应用程序仅仅是Eclipse是干什么的,所以任何的库装载行为cocoa见以这种方式。
5.是否有你的两个库依赖于任何其他库?如果是这样,你需要确保他们也可以访问到JVM。请注意,手动设置“-Djava.library.path”似乎清除预设的库路径。所以,用下面的代码:public class LibTest{
public static void main(String[] args){
String property= System.getProperty("java.library.path");
StringTokenizer parser= new StringTokenizer(property,":");
while(parser.hasMoreTokens()){
System.err.println(parser.nextToken());
}
}
}
从eclipse与Java 1.6.0_14输出启动:/opt/java/jre/lib/i386/client
/opt/java/jre/lib/i386
/opt/java/jre/../lib/i386
/opt/java/jre/lib/i386/client
/opt/java/jre/lib/i386
/usr/lib/xulrunner-devel-1.9.0.11
/usr/lib/xulrunner-devel-1.9.0.11
/usr/java/packages/lib/i386
/lib
/usr/lib
但是,当我设置的JVM ARG“-Djava.library.path=/ tmp目录/”我只得到:/tmp/
如果您要手动设置java.library.path这也许可以解释为什么LDD的作品从行,但你的,所以不会从eclipse/ java的。你可以试试不设置,而不是调用System.loadLibrary java.library.path System.load的绝对路径到库中。这可能使JVM能够找到你,所以,默认的路径寻找它的依赖时。当然,如果这是,那么你也可以尝试打开JNI调试输出与“-verbose:当使用JNI”上线。这可能给您的线索来解决问题。
6.是LD_LIBRARY_PATH环境工作
7.加入这个答案可能是它可以在AIX机器,我们需要设置LIBPATH变量,而不是LD_LIBRARY_PATH。
如何捕获 System.loadLibrary 产生的异常
1.我认为这个问题是与调用System.loadLibrary(字符串)LD_LIBRARY_PATH。使用LoadLibrary(“富”)将看着你的java.library.path的libfoo.so。如果发现任何libfoo.so你会得到这个错误。现在,如果你只设置了LD_LIBRARY_PATH,你想要的原始符号将自动被拾起的连接器,所以你不需要设置-Djava.library.path。在我的经验与swig在GDAL项目,这个错误其实是无害的,因为LD_LIBRARY_PATH设置,这将正常工作。我会使用-Djava.library.path和调用调用LoadLibrary explitly CodeGo.net,原因是,如果你决定要使用的webstart部署你的应用程序,你将需要显式地调用LoadLibrary来让你的本地库拾起。当月食我遵循达夫给您编辑在构建路径Libraries选项卡下的jar本地库的说明。只需再次,这只是设置在幕后java.library.path。 2.你可以试试-Djava.library.path=actual.so行吧?在Windows上,我也有类似的问题,第三方库,JNI封装的DLL,它的DLL。我的项目已经在lib目录下的DLL,这样我添加到库的路径(如:PATH=%PATH%;./lib变,一切都开始工作。 3.据我知道的Eclipse没有关系'的LD_LIBRARY_PATH。要树立正确的本地库路径的最简单的方法就是去项目属性-> Java构建路径->库然后展开或者JRE的系统库条目或(如果有的话)的 jar文件的本地库,选择“本地库位置”,然后单击“编辑...”并选择你的库。实际上它并设置-Djava.library.path变量,以便你必须包括这行,如果你开始从外面蚀你的程序的文件夹。 4.这可能是因为你只需要找到运行配置对话框中合适的地方放-Djava.library.path=...选项。随口说说我想你想-D在选项卡上的“VM定义,而如果要定义LD_LIBRARY_PATH就是那张在标签上。Eclipse的让你把东西在那里他们赢得'你觉得什么反正我库这样的地方以前,如果我有机会,我会仰望我做了什么,在这里编辑我的答案。另一件事,试图与LD_DEBUG玩。您可以设置变量LD_DEBUG的事情(尝试所有),然后Linux加载程序会泄露的各种关于什么一个应用程序试图加载,它在寻找的东西,等等。当然,这种预先假定您启动Eclipse从行,所以你可以同时设置ENV增值经销商,看到了loader的诊断,但就系统而言,当你从Eclipse中运行你的应用,你的应用程序仅仅是Eclipse是干什么的,所以任何的库装载行为cocoa见以这种方式。 5.是否有你的两个库依赖于任何其他库?如果是这样,你需要确保他们也可以访问到JVM。请注意,手动设置“-Djava.library.path”似乎清除预设的库路径。所以,用下面的代码:public class LibTest{ public static void main(String[] args){ String property= System.getProperty("java.library.path"); StringTokenizer parser= new StringTokenizer(property,":"); while(parser.hasMoreTokens()){ System.err.println(parser.nextToken());}}}从eclipse与Java 1.6.0_14输出启动:/opt/java/jre/lib/i386/client/opt/java/jre/lib/i386/opt/java/jre/../lib/i386/opt/java/jre/lib/i386/client/opt/java/jre/lib/i386/usr/lib/xulrunner-devel-1.9.0.11/usr/lib/xulrunner-devel-1.9.0.11/usr/java/packages/lib/i386/lib/usr/lib但是,当我设置的JVM ARG“-Djava.library.path=/ tmp目录/”我只得到:/tmp/如果您要手动设置java.library.path这也许可以解释为什么LDD的作品从行,但你的,所以不会从eclipse/ java的。你可以试试不设置,而不是调用System.loadLibrary java.library.path System.load的绝对路径到库中。这可能使JVM能够找到你,所以,默认的路径寻找它的依赖时。当然,如果这是,那么你也可以尝试打开JNI调试输出与“-verbose:当使用JNI”上线。这可能给您的线索来解决问题。 6.是LD_LIBRARY_PATH环境工作 7.加入这个答案可能是它可以在AIX机器,我们需要设置LIBPATH变量,而不是LD_LIBRARY_PATH。
感谢您花时间阅读本文!我们希望通过对ldlibrarypath和如何解决java调dll报Unable to load library的错误的问题进行探讨,为您提供了一些有用的见解和解决方案。如果您需要更多帮助或者有其他疑问,请不要犹豫与我们联系。