首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.library.path中没有jaybird [dll]

java.library.path中没有jaybird [dll]
EN

Stack Overflow用户
提问于 2012-08-11 00:04:45
回答 1查看 2.1K关注 0票数 2

当使用嵌入式firebird导出我的java项目时,我在控制台中得到了这样的消息:"no jaybird[22Any version,我猜] in java.library.path(没有jaybird[22Any version,我猜]“。

但它确实位于我的项目的库路径中,该项目自引用到我的工作区。我试过很多变通方法,比如

代码语言:javascript
复制
System.LoadFile("jaybird22.dll") //full uri, just the name of the dll, nada
System.Load("jaybird22.dll") //full uri, just the name of the dll, nada

或者将该dll插入到用户库中,或者将该dll作为引用库放入另一个文件夹中。

这真的让我很紧张。如何解决此错误?JNI?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-13 23:06:02

解决方案

好的,这是这个问题的解决方案。问题是,在jar中,没有dll或任何包含文件的文件夹被打包到jar中。因此,几乎每个dll、包含图像的文件夹或任何东西都必须位于可运行jar旁边的文件夹中。jar中唯一打包的是外部jar和用来运行软件的.java文件。

无论如何,对于Firebird嵌入式模式,这是相当棘手的。由于jaybird(SOME_VERSION).dll必须放在所有.dll、.msg文件的旁边。但是JVM会要求jaybird dll在java.library.path中,当然这只是system32和一些与程序无关的java文件夹。

因此,为了让您的程序将您的runnable jar文件夹检测为java.library.path (实际上应该称为路径),您可以将这些LOC放在main方法中:

代码语言:javascript
复制
String decodedPath =URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8");
decodedPath=decodedPath.substring(1, decodedPath.length()-1).replaceAll("/", "\\\\");
System.setProperty("java.library.path",decodedPath+";"+System.getProperty("java.library.path")));

我将以前的目录包含在库路径中,因为我只是将它添加到列表中。

请注意,这些LOC必须在任何代码之前,这也包括调用构造函数。如果您正在使用全局静态模块或JNI调用,请小心。

我希望这能节省一些人的时间,我已经失去了12个小时的工作,试图正确地解决这个问题。

如果管理员不删除我的编辑或我自己回答的问题,我将非常感谢。

快乐编码=D

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11905362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档