【问题标题】:UnsatisfiedLinkError for M1 Macs while running Play server locally在本地运行 Play 服务器时 M1 Mac 出现 UnsatisfiedLinkError
【发布时间】:2022-01-18 22:40:09
【问题描述】:

在使用 LeadIQ 的 play 样板运行新项目时,我们将在 5.7.0 以下的旧版本 JNA 中遇到 UnsatisfiedLinkError。

我认为这是由于 ARM M1 架构之间的二进制文件不兼容。怎么解决?

这是完整的堆栈跟踪,显示 JNA 二进制文件中的“没有匹配的架构”。

[error] java.lang.UnsatisfiedLinkError: /Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp: dlopen(/Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp, 1): no suitable image found.  Did find:
[error]     /Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp: no matching architecture in universal wrapper
[error]     /Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp: no matching architecture in universal wrapper
[error]     at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
[error]     at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2442)
[error]     at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2498)
[error]     at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2694)
[error]     at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2627)
[error]     at java.base/java.lang.Runtime.load0(Runtime.java:768)
[error]     at java.base/java.lang.System.load(System.java:1837)
[error]     at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:1018)
[error]     at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:988)
[error]     at com.sun.jna.Native.<clinit>(Native.java:195)
[error]     at io.methvin.watchservice.jna.CarbonAPI.<clinit>(CarbonAPI.java:20)
[error]     at io.methvin.watchservice.jna.CFStringRef.toCFString(CFStringRef.java:23)
[error]     at io.methvin.watchservice.MacOSXListeningWatchService.register(MacOSXListeningWatchService.java:127)
[error]     at io.methvin.watchservice.WatchablePath.register(WatchablePath.java:50)
[error]     at io.methvin.watcher.DirectoryWatcher.register(DirectoryWatcher.java:400)
[error]     at io.methvin.watcher.DirectoryWatcher.registerAll(DirectoryWatcher.java:373)
[error]     at io.methvin.watcher.DirectoryWatcher.<init>(DirectoryWatcher.java:193)
[error]     at io.methvin.watcher.DirectoryWatcher$Builder.build(DirectoryWatcher.java:122)
[error]     at play.dev.filewatch.DefaultFileWatchService.watch(DefaultFileWatchService.scala:44)
[error]     at play.dev.filewatch.FileWatchService$$anon$1.watch(FileWatchService.scala:95)
[error]     at play.runsupport.Reloader.<init>(Reloader.scala:443)
[error]     at play.runsupport.Reloader$.reloader$lzycompute$1(Reloader.scala:283)
[error]     at play.runsupport.Reloader$.play$runsupport$Reloader$$reloader$1(Reloader.scala:275)
[error]     at play.runsupport.Reloader$.startDevMode(Reloader.scala:306)
[error]     at play.sbt.run.PlayRun$.devModeServer$lzycompute$1(PlayRun.scala:100)
[error]     at play.sbt.run.PlayRun$.devModeServer$1(PlayRun.scala:83)
[error]     at play.sbt.run.PlayRun$.$anonfun$playRunTask$3(PlayRun.scala:107)
[error]     at play.sbt.run.PlayRun$.$anonfun$playRunTask$3$adapted(PlayRun.scala:67)
[error]     at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] stack trace is suppressed; run last Compile / run for the full output
[error] (Compile / run) java.lang.UnsatisfiedLinkError: /Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp: dlopen(/Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp, 1): no suitable image found.  Did find:
[error]     /Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp: no matching architecture in universal wrapper
[error]     /Users/zackng/Library/Caches/JNA/temp/jna1415930593236960966.tmp: no matching architecture in universal wrapper
[error] Total time: 1 s, completed Dec 15, 2021, 10:36:16 AM

【问题讨论】:

    标签: java macos scala sbt jna


    【解决方案1】:

    引自GitHub

    并替换 .sbt/boot/scala-2.12.14/org.scala-sbt/sbt/1.5.5/jna-5.5.0.jar 使用 jna-5.8.0.jar 解决了这个问题,所以在 sbt.io 中增加依赖是 绝对需要

    基本上删除../sbt/1.5.5/jna-...中现有的jna,并将jna版本>= 5.6.0的新jar复制到jna-v.v.v.jar

    具体来说,我使用的是 5.10.0,服务器现在运行! :tada:

    感谢 Github 用户 vbabenkoru 和 Elia 对我的帮助!

    编辑:根据发行说明修改为 5.6.0,感谢 Daniel Widdis 指出!

    【讨论】:

      【解决方案2】:

      有两个与 macOS 和 M1 芯片相关的兼容性问题可能导致UnsatisfiedLinkErrors

      您遇到的问题与缺乏对 aarch64(M1 架构)的支持有关。这是JNA 5.7.0 中的fixed,升级到该版本或更高版本可以解决问题。

      另一个可能产生此错误的问题与 Apple 如何更改系统库在 macOS 11 (Big Sur) 中的加载方式有关,并在未来的版本中继续存在。

      来自macOS Big Sur 11.0.1 Release Notes

      macOS Big Sur 11.0.1 中的新功能,系统附带了所有系统提供的库的内置动态链接器缓存。作为此更改的一部分,文件系统上不再存在动态库的副本。尝试通过在路径中查找文件或枚举目录来检查动态库是否存在的代码将失败。相反,通过尝试 dlopen() 路径来检查库是否存在,这将正确检查缓存中的库。

      JNA 在Release 5.6.0 中修复了这个加载问题。

      【讨论】:

        猜你喜欢
        • 2022-09-29
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 2020-04-12
        • 2018-07-11
        • 2021-10-31
        • 2023-02-08
        相关资源
        最近更新 更多