NoSuchMethodError 使用 JNA User32 平台图

NoSuchMethodError using JNA User32 platform map

我在第一次尝试使用 User32.Instance 时收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.sun.jna.Native.load(Ljava/lang/String;Ljava/lang/Class;Ljava/util/Map;)Lcom/sun/jna/Library;
at com.sun.jna.platform.win32.User32.(User32.java:48)

同时尝试 运行 Windows User32 class 函数的 JNA 预定义映射。

我尝试了运行以下代码:

HWND hwnd = User32.INSTANCE.FindWindow(null,"new 2 - Notepad++");
User32.INSTANCE.SetForegroundWindow(hwnd);

我是否必须声明自己的接口,或者我能否使用位于 jna-platform 中的 User32 JNA 映射?我做错了什么?

编辑:错误在 com.sun.jna.platform.win32.user32:

的这一行
User32 INSTANCE = Native.load("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);

我能够通过针对旧的 jna 包(5.0.0 之前的版本)和新的 jna-platform 包(5.0.0)进行编译来重现此错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.sun.jna.Native.load(Ljava/lang/String;Ljava/lang/Class;Ljava/util/Map;)Lcom/sun/jna/Library;
    at com.sun.jna.platform.win32.User32.<clinit>(User32.java:48)
    at sandboxjava.Main.main(Main.java:8)

问题是 JNA 在 5.0.0 版本中弃用了 Native.loadLibrary 方法并引入了 Native.load 方法。较新的jna-platform包使用的是新方法,但是由于jna包是旧版本,所以load包中根本不存在该方法。

您应该将 jna 软件包升级到 5.0.0(撰写本文时的最新版本),或者将 jna-platform 降级到 5.0.0 之前的版本。

使用以下依赖项更新 maven,它对我有用。

    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>4.5.1</version>
    </dependency>

在我的项目中,同时存在以下三个依赖时会出现此错误。我将 tess4j 依赖移到最后,它起作用了。

<dependency>
           <groupId>net.sourceforge.tess4j</groupId>
           <artifactId>tess4j</artifactId>
           <version>3.4.0</version>
</dependency>
<dependency>
           <groupId>com.sun.jna</groupId>
           <artifactId>jna</artifactId>
           <version>4.4.0</version>
           <scope>system</scope>
           <systemPath>${project.basedir}\src\resources\lib\opencv\jna- 
           4.4.0.jar</systemPath>
</dependency>
<dependency>
            <groupId>com.sun.jna.paltform</groupId>
            <artifactId>paltform</artifactId>
            <version>4.4.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}\src\resources\lib\opencv\jna-platform-4.4.0.jar</systemPath>
</dependency>