我正在尝试使用以下代码在java中加载dll 的System.loadLibrary( “MYDLL”);
项目位于D:\ development \ project \中,我已将dll放在D:上。然后我在eclipse配置中给出了以下VM参数 -Djava.library.path = d:/
但是当我跑步时,我得到 UnsatisifiedLinkerError 。谷歌搜索了一下后,我用了 System.load( “d:\ MYDLL.DLL”);
但是再次遇到同样的问题,有人可以帮忙吗?
答案 0 :(得分:8)
如果在库路径中指定DLL文件名,请忽略它。此外,您的System.loadLibrary调用应该只是'mydll'。我可以告诉你(根据经验),如果你把DLL放在Eclipse项目的根目录中(即D:\ Eclipse Workspace \ Proj),应该工作。任何其他链接器错误可能来自查找其他DLL的依赖性问题。例外是一样的。使用Dependency Walker(http://www.dependencywalker.com/)之类的东西来查看你的DLL是否依赖于系统库路径上的其他任何东西。
编辑: UnsatisfiedLinkError :如果Java虚拟机无法找到声明为native的方法的相应本机语言定义,则抛出此异常 - 您似乎正在使用不存在的JNI函数。 / p>
答案 1 :(得分:4)
查看如何正确设置本机依赖项here。另外,请确保使用正确的JVM:在我的情况下,找不到DLL,因为它是32位DLL,但我使用的是x64 JVM!
答案 2 :(得分:3)
使用System.loadLibrary("mydll")
工作正常,你也可以使用那个。如果您使用javah
并且您认为您的DLL一切正常,则有两种可能性:
.
并放置你的DLL在当前的工作目录中。 JVM找不到您的DLL所依赖的DLL :如果您的DLL中有任何依赖库,它们被JVM搜索 NOT ,但是由Windows本身。并且Windows不知道java.library.path
,因此它将在系统PATH
变量中查找。如果您有可能,可以在启动JVM之前将系统PATH
变量设置为DLL的位置,一切都会好的。或者你可以像这样使用JVM加载所有的DLL
的System.loadLibrary( “dll_1”);
的System.loadLibrary( “dll_2”);
的System.loadLibrary( “dll_3”);
其中dll_3.dll
取决于dll_2.dll
,这取决于dll_1.dll
。
希望有所帮助。
答案 3 :(得分:3)
您遇到的一个问题是: System.load( “d:\ MYDLL.DLL”); 应该 System.load( “d:\\ MYDLL.DLL”); 要么 System.load( “d:/mydll.dll”);
我在System.load上取得了更多成功,但是loadlibrary更适合多平台设计。 它为你找出了扩展名。
答案 4 :(得分:1)
把你的Almafa.dll放到C:/ Java / jre7 / lib或/ bin抱歉,我不记得了。完成后不再需要配置,只需说
即可 static{
System.LoadLibrary("Almafa");
}
在类中,您要加载它。它仅适用于Java项目,在Android项目中需要使用JNI。我现在已经发布了3天不睡觉的结果:)
答案 5 :(得分:0)
@ alee-您可以复制并粘贴windows的system32文件夹中的dll文件,并尝试通过System.loadLibrary(“mydll”)调用库...我想它可能有效... < / p>
答案 6 :(得分:0)
System.loadLibrary 从JVM路径(JDK bin路径)加载DLL。
如果您要加载带路径的显式文件,请使用 System.load ()
另请参阅:Difference between System.load() and System.loadLibrary in Java
public class MyClass
{
static
{
System.load("MyJNI.dll");
}
}
答案 7 :(得分:0)
将项目中的库路径作为本机库位置,似乎已经解决了。
答案 8 :(得分:0)
我通过使用以下方法解决了我的错误:
static {
try {
System.loadLibrary("myDLL");
} catch (Exception e) {
e.printStackTrace();
}
}
而不是使用System.load("myDLL.dll")