You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:36:01