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>
我在第一次尝试使用 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>