dokanyjava文件系统中的JNA库初始化问题



目前我们正在尝试适应dokanyjava(由@jhult编写(存储库。我们的目标是使用dokany虚拟驱动器,但问题是库在我们的项目中没有初始化,而且存储库的示例main也不起作用(MountMemoryFS(。

错误为

java.lang.UnsatisfiedLinkError: Error looking up function 'DokanMapStandardToGenericAccess': The specified procedure could not be found.
at com.sun.jna.Function.<init>(Function.java:245)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:566)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:542)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:528)
at com.sun.jna.Native.register(Native.java:1770)
at com.sun.jna.Native.register(Native.java:1643)
at com.sun.jna.Native.register(Native.java:1360)
at com.dokany.java.NativeMethods.<clinit>(NativeMethods.java:28)
at com.dokany.java.DokanyDriver.start(DokanyDriver.java:70)
at com.dokany.java.examples.memoryfs.MountMemoryFS.main(MountMemoryFS.java:46)

Dokany版本:1.5.1Java版本:8

我们怎样才能解决这个问题?

您的Java代码和您正在使用的dokan1.dll文件之间的版本不匹配,因为您的代码是基于维护人员的一个非常旧的个人分支,而不是基于与您想要使用的版本匹配的官方上游项目。

堆栈跟踪指向NativeMethods作为dokany库中问题的来源:

String DOKAN_DLL = "dokan1";
static {
Native.register(DOKAN_DLL);
}

JNA正在查找dokan1.dll文件,但在DLL中找不到DokanMapStandardToGenericAccess方法。

dokany站点的问题#620表明该方法是作为1.1.0突破性变更的一部分移动的,1.1.0的变更日志表明:

Library-将DokanMapStandardToGenericAccess与DokanMapKernelToUserCreateFileFlags 合并

这里的症状表明您有一个更新版本的dokan1.dll,它不包括此方法,但您使用的是1.1.0之前版本的java代码。

您在问题中链接到了维护人员的个人分支,该分支没有表示版本,但最后一次合并到上游项目是在2017-07-03,而1.1.0版本是在2020-04-23,如代码的上游dokan-dev/dokan版本所示。这两者都与发布1.5.1的dokan-dev/dokany项目的当前位置不匹配。

要解决此问题,请在正确的站点使用正确的(1.5.1(标记中的Java代码(或下载JAR或使用依赖项管理器(,将Java代码与DLL版本相匹配。或者更好的是,使用最新的2.x版本的代码和DLL。

最新更新