JNI不兼容Apple ARM架构:寻求鼠标键盘监听替代库
适配Apple Silicon(M1/M2)的Java全局键鼠事件监听库推荐
问题场景
我此前使用jnativehook依赖在Windows及Intel芯片Mac系统上实现全局鼠标和键盘事件监听功能,该依赖在Intel芯片设备上运行正常。但切换至搭载M1芯片(Apple Silicon,ARM架构)的Mac设备时出现异常,请求推荐适配该架构的替代库。
使用的代码
GlobalScreen.registerNativeHook(); GlobalScreen.addNativeKeyListener(this); GlobalScreen.addNativeMouseListener(this); GlobalScreen.addNativeMouseMotionListener(this); GlobalScreen.addNativeMouseWheelListener(this);
Maven依赖:
<dependency> <groupId>com.1stleg</groupId> <artifactId>jnativehook</artifactId> <version>2.1.0</version> </dependency>
报错信息
Apr 01, 2024 11:26:16 PM org.jnativehook.DefaultLibraryLocator getLibraries SEVERE: Unable to extract the native library /org/jnativehook/lib/darwin/unsupported/libJNativeHook.dylib! Exception in thread "JavaFX Application Thread" java.lang.UnsatisfiedLinkError: 'java.lang.Integer org.jnativehook.GlobalScreen.getAutoRepeatRate()' at org.jnativehook.GlobalScreen.getAutoRepeatRate(Native Method) at org.jnativehook.GlobalScreen.<clinit>(Unknown Source) at com.staffViz.controllers.main_controllers.RunningTrackerModuleController.itemStateChanged(RunningTrackerModuleController.java:177) at com.staffViz.controllers.main_controllers.RunningTrackerModuleController.initialize(RunningTrackerModuleController.java:121) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2670) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2563) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2531) at com.staffViz.controllers.main_controllers.ProjectMainScreenController.startTracker(ProjectMainScreenController.java:1362) at com.staffViz.listViewCell.TaskCell.startTracker(TaskCell.java:325) at com.staffViz.listViewCell.TaskCell.lambda$updateItem$7(TaskCell.java:168) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:232) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:189) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3688) at javafx.scene.Scene$MouseHandler.process(Scene.java:3993) at javafx.scene.Scene.processMouseEvent(Scene.java:1890) at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2708) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:411) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:301) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:450) at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:449) at com.sun.glass.ui.View.handleMouseEvent(View.java:551) at com.sun.glass.ui.View.notifyMouse(View.java:937) at com.sun.glass.ui.mac.MacView.notifyMouse(MacView.java:127)
适配Apple Silicon的替代库推荐
1. JNativeHook 最新快照版
你使用的2.1.0版本未适配Apple Silicon,但项目最新快照版本已添加ARM64架构支持。无需更换代码逻辑,直接切换依赖即可:
<repository> <id>sonatype-snapshots</id> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> </repository> <dependency> <groupId>com.1stleg</groupId> <artifactId>jnativehook</artifactId> <version>2.2.0-SNAPSHOT</version> </dependency>
2. Java Native Access (JNA) + 系统API封装
JNA原生支持Apple Silicon,可直接调用Mac系统CoreGraphics框架的CGEventTapCreate等API实现全局键鼠监听。优点是高度可控,缺点是需要自行封装系统API,对Mac系统底层逻辑有一定了解成本。
3. JavaFX/Swing 内置事件监听器(仅限应用内)
若仅需监听自身应用内的键鼠事件,可直接使用JavaFX或Swing自带的事件监听器,无需额外依赖,完全跨平台适配Apple Silicon。但无法监听其他应用的全局事件。
4. AutoItX4Java
基于AutoIt封装的Java库,支持全局键鼠操作与监听,已适配Apple Silicon。API封装简洁,适合快速开发系统级交互功能。
内容的提问来源于stack exchange,提问作者SYED MUSTAFA HUSSAIN
相关产品推荐
相关产品推荐

