當使用 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
uj5u.com熱心網友回復:
參考自GitHub
并用 jna-5.8.0.jar 替換 .sbt/boot/scala-2.12.14/org.scala-sbt/sbt/1.5.5/jna- 5.5.0.jar 解決了這個問題,因此增加了依賴sbt.io 絕對是必需的
基本上洗掉現有的 jna../sbt/1.5.5/jna-...
并將 jna 版本 >= 5.6.0 的新 jar 復制為jna-v.v.v.jar
具體來說,我使用的是 5.10.0,服務器現在可以運行了!:tada:
感謝 Github 用戶vbabenkoru
和 Elia 幫助我解決這個問題!
編輯:根據發行說明修改為 5.6.0,感謝 Daniel Widdis 指出!
uj5u.com熱心網友回復:
有兩個與 macOS 和 M1 芯片相關的兼容性問題可能導致UnsatisfiedLinkErrors
.
您遇到的問題與缺乏對aarch64
M1 架構的支持有關。這已在JNA 5.7.0中修復,升級到該版本或更高版本可解決該問題。
另一個可能產生此錯誤的問題與 Apple 如何更改系統庫在 macOS 11 (Big Sur) 中加載的方式有關,并在未來版本中繼續。
來自macOS Big Sur 11.0.1 發行說明:
macOS Big Sur 11.0.1 中的新功能,系統附帶了所有系統提供的庫的內置動態聯結器快取。作為此更改的一部分,檔案系統上不再存在動態庫的副本。嘗試通過在路徑中查找檔案或列舉目錄來檢查動態庫是否存在的代碼將失敗。相反,通過嘗試 dlopen() 路徑來檢查庫是否存在,這將正確檢查快取中的庫。
JNA 在5.6.0 版中修復了這個加載問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384762.html