NativeLibraryDarwin.java:64 - 无法针对 JNA link C 库。本机方法将不可用

NativeLibraryDarwin.java:64 - Failed to link the C library against JNA. Native methods will be unavailable

如果您正在使用配备 M1 芯片的最新 MacBook pro。安装 Cassandra 并启动它可能会引发错误。

步骤 1:安装Jdk8 2: 安装 Cassandra 4.0.1

如何开始:/opt/homebrew/opt/cassandra/bin/cassandra -f

输出:

ERROR [main] 2021-10-08 00:03:12,568 NativeLibraryDarwin.java:64 - Failed to link the C library against JNA. Native methods will be unavailable.
java.lang.UnsatisfiedLinkError: /opt/homebrew/Cellar/cassandra/4.0.1/tmp/jna9964159388012624603.tmp: dlopen(/opt/homebrew/Cellar/cassandra/4.0.1/tmp/jna9964159388012624603.tmp, 1): no suitable image found.  Did find:
    /opt/homebrew/Cellar/cassandra/4.0.1/tmp/jna9964159388012624603.tmp: no matching architecture in universal wrapper
    /opt/homebrew/Cellar/cassandra/4.0.1/tmp/jna9964159388012624603.tmp: no matching architecture in universal wrapper
    at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
    at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2442)
    at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2498)
    at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2694)
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2627)
    at java.base/java.lang.Runtime.load0(Runtime.java:768)
    at java.base/java.lang.System.load(System.java:1837)
    at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:1018)
    at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:988)
    at com.sun.jna.Native.<clinit>(Native.java:195)
    at com.sun.jna.NativeLibrary.<clinit>(NativeLibrary.java:87)
    at org.apache.cassandra.utils.NativeLibraryDarwin.<clinit>(NativeLibraryDarwin.java:55)
    at org.apache.cassandra.utils.NativeLibrary.<clinit>(NativeLibrary.java:98)
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:258)
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:763)
    at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:887)
INFO  [main] 2021-10-08 00:03:12,596 MonotonicClock.java:199 - Scheduling approximate time conversion task with an interval of 10000 milliseconds
INFO  [main] 2021-10-08 00:03:12,597 MonotonicClock.java:335 - Scheduling approximate time-check task with a precision of 2 milliseconds
WARN  [main] 2021-10-08 00:03:12,597 StartupChecks.java:143 - jemalloc shared library could not be preloaded to speed up memory allocations
WARN  [main] 2021-10-08 00:03:12,597 StartupChecks.java:187 - JMX is not enabled to receive remote connections. Please see cassandra-env.sh for more info.
ERROR [main] 2021-10-08 00:03:12,597 CassandraDaemon.java:909 - The native library could not be initialized properly.

解决方案:

  1. 查找 jna-..*.jar 所在的位置。你可以使用 find . -name '*.jar' | grep cassandra
  2. 浏览至 https://search.maven.org/artifact/net.java.dev.jna/jna/5.8.0/jar 并从页面右上角的下载按钮下载 jar。
  3. 将您的 jna-..*.jar 文件替换为您下载的文件。在我的例子中,我替换了 jna-5.6.0.jar。请记住将文件名保留为您以前的文件名。示例我移动了 jna-5.8.0.jar 并重命名为 jna-5.6.0.jar

mv /Users/mansooralikhan/Downloads/jna-5.8.0.jar /opt/homebrew/Cellar/cassandra/4.0.1/libexec/jna-5.6.0.jar

  1. 重启卡桑德拉

为了回应 Mansoor 的回答,我要补充一点,不幸的是,Apache Cassandra 4.0 附带的 JNA 版本与 M1 架构不兼容。

要解决这个问题,请前往 JNA GitHub 存储库的“下载”部分,您应该可以在其中找到最新版本的 JNA jar 文件。

https://github.com/java-native-access/jna#jna

下载 JNA 5.8 或更高版本,并替换 Cassandra 的 lib/ 目录中现有的 jna-5.6.0.jar 文件(基于 tarball 的安装)。

只是为了补充这里的答案,我想为后代注意,JNA 5.6.0 不支持的 Apple M1 设备上的 arm64 问题之前已在 Apache Cassandra 项目中提出。

最近,CASSANDRA-17019 报道了它。我在项目 devs/contributors 中提出了它,希望它能尽快得到审查和解决。干杯!