我正在使用以下代码在JNA中加载一个DLL(不相关的代码被省略):
public class JNAMain {
public interface PointShapeBuffer extends Library { ... }
public static void main(String[] args){
System.setProperty("jna.library.path", "c:\\jnadll");
System.setProperty("java.library.path", "c:\\jnadll");
PointShapeBuffer jna = (PointShapeBuffer) Native.loadLibrary("FileGDBAPI", PointShapeBuffer.class);
}
}
我收到以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'FileGDBAPI': The specified module could not be found.
我也试过设置VM args。任何建议都会很棒。
编辑:作为参考,我使用公开的库找到here(需要注册)。
根据我的经验,在64位Win7上从64位jvm调用32位本机dll时,通常会看到此错误。 Win7在64位和32位应用程序中的工作方式不同。
在64位Win7上,您可以使用本机32位dll调用函数,但是您需要使用32位JVM。
原因是32位dll与64位应用程序不兼容,64位Win7使用32位仿真器运行32位应用程序。虽然Windows库可能被称为xxxx32.dll(例如user32.dll),但64位Win7上的System32文件夹中的库是64位库,而不是32位,而SysWOW64中的库是32位库,令人困惑吧?!?
您还可以将库放在32位系统文件夹(SysWOW64)中,并在32位JVM中进行JNI调用。
查看以下链接,了解64位Win7如何处理库的完整解释;
http://www.samlogic.net/articles/32-64-bit-windows-folder-x86-syswow64.htm
如果你真的想帮助自己入睡,那就试着开始吧;)
http://msdn.microsoft.com/en-us/windows/hardware/gg463051.aspx
改变你的:
Native.loadLibrary("FileGDBAPI", PointShapeBuffer.class);
至:
Native.loadLibrary("C:\\jnadll\\FileGDBAPI.dll", PointShapeBuffer.class);
如果你深入了解jna源代码,你会在NativeLibrary类中找到一个漂亮的小钩子:
/** Use standard library search paths to find the library. */
private static String findLibraryPath(String libName, List searchPath) {
//
// If a full path to the library was specified, don't search for it
//
if (new File(libName).isAbsolute()) {
return libName;
}
...
因此,如果您只是通过绝对路径而不使用searchPath,它将会捕获。这就是为什么你不必担心jna.library.lib。
您需要指定包含DLL的文件夹,而不是DLL的实际路径。
例如对于baz.dll
的c:\foo\bar\baz.dll
,路径应该设置为c:\\foo\\bar
。 (注意如果你使用退格键,你必须使用反斜杠来逃避它们)
您可能希望使用jna.jar和platform.jar下载最新版本,并且只包含这些版本。不需要设置路径。
就像在一些评论中已经提到的那样:检查你的DLL /库的依赖关系。最好的工具是Dependency Walker(http://www.dependencywalker.com/)。只有当你的所有依赖关系都得到满足时,jna才能找到你的DLL ....我花了很长时间才弄明白这一点
这可能是因为lebweb套件中存在混淆。我不确定,但那必须是现在你可以做一件事尝试这个。
$ dpkg -l | grep -i jna
尝试此命令,如果你得到这个输出
ii libjna-java 3.2.7-4 Dynamic access of native libraries from Java without JNI
或者任何其他输出然后你需要从系统中删除那个jna,因为如果程序本身有jna jar,那么就不需要系统jna了。做这样的事情。
sudo apt-get autoremove libjna-java
并尝试再次重新启动该应用程序。它将运行并且它没有运行然后尝试安装新版本的libwebkit-gtk。
希望这会有所帮助。这对我有帮助。