当使用嵌入式firebird导出我的java项目时,我在控制台中得到了这样的消息:"no jaybird[22Any version,我猜] in java.library.path(没有jaybird[22Any version,我猜]“。
但它确实位于我的项目的库路径中,该项目自引用到我的工作区。我试过很多变通方法,比如
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?
发布于 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方法中:
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
https://stackoverflow.com/questions/11905362
复制相似问题