[英]Java Eclipse java.lang.UnsatisfiedLinkError JNI loading dll and C code
[英]Loading DLL in Java - Eclipse - JNI
我试图使用以下代码System.loadLibrary(“mydll”)在java中加载一个DLL;
该项目放在D:\\ development \\ project \\中,我已将dll放在D:上。 然后我在eclipse配置中给出了以下VM参数-Djava.library.path = D:/
但是当我运行时,我得到UnsatisifiedLinkerError 。 谷歌搜索后,我使用System.load(“D:\\ mydll.dll”);
但是再次遇到同样的问题,有人可以帮忙吗?
在库路径中指定DLL文件名的地方,省略它。 此外,您的System.loadLibrary调用应该只是'mydll'。 我可以告诉你(根据经验),如果你把DLL放在Eclipse项目的根目录中(即D:\\ Eclipse Workspace \\ Proj),它应该可行。 任何其他链接器错误可能来自查找其他DLL的依赖性问题。 例外是一样的。 使用Dependency Walker( http://www.dependencywalker.com/ )之类的东西来查看你的DLL是否依赖于系统库路径上的其他任何东西。
编辑: UnsatisfiedLinkError :如果Java虚拟机无法找到声明为native的方法的相应本机语言定义,则抛出该异常 - 您似乎正在使用不存在的JNI函数。
查看如何在此处正确设置本机依赖项。 另外,请确保使用正确的JVM:在我的情况下,找不到DLL,因为它是32位DLL,但我使用的是x64 JVM!
你遇到的一个问题是:System.load(“D:\\ mydll.dll”); 应该是System.load(“D:\\\\ mydll.dll”); 或System.load(“D:/mydll.dll”);
我在System.load上取得了更大的成功,但是loadlibrary更适合多平台设计。 它为你找出了扩展。
使用System.loadLibrary("mydll")
工作正常,你也可以使用那个。 如果您使用javah
并且您认为您的DLL一切正常,则有两种可能性:
.
并将您的DLL放在当前工作目录中。 JVM找不到您的DLL依赖的DLL :如果您的DLL中有任何依赖库,JVM 不会搜索它们,而是由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
。
希望有所帮助。
将你的Almafa.dll放入C:/ Java / jre7 / lib或/ bin抱歉,我完全不记得了。 完成后不再需要配置,只需说
static{ System.LoadLibrary("Almafa"); }
在类中,您要加载它。 它仅适用于Java项目,在Android项目中需要使用JNI。 我现在发布了3天没睡觉的结果:)
System.loadLibrary从JVM路径(JDK bin路径)加载DLL。
如果要使用路径加载显式文件,请使用System.load ()
另请参见: Java中的System.load()和System.loadLibrary之间的区别
public class MyClass
{
static
{
System.load("MyJNI.dll");
}
}
@ alee-你可以复制并粘贴windows的system32文件夹中的dll文件,并尝试通过System.loadLibrary(“mydll”)调用库...我猜它可能有用......
将项目中的库路径作为本机库位置,似乎已解决。
我通过使用以下方法解决了我的错误:
static {
try {
System.loadLibrary("myDLL");
} catch (Exception e) {
e.printStackTrace();
}
}
而不是使用System.load("myDLL.dll")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.