UnsatisfiedLinkError:mach-o 文件,但它是一个不兼容的架构(有“arm64”,需要“x86_64”))

问题描述 投票:0回答:1

我尝试从 Scala 调用 C++ 函数,但在构建连接时遇到一些问题。

在尝试从 Scala 代码连接 C++ 函数时,我遵循了以下步骤。

这是我的 C++ 示例函数(example.cpp):

#include <iostream>

extern "C" {
    void printSomething() {
        std::cout << "Hello from C++!" << std::endl;
    }
}

使用以下命令将其编译成共享库:

g++ -shared -o libexample.so example.cpp

使用本机方法创建了一个 Java 类:

public class NativeLibrary {
    static {
        System.load("/Users/xyz/xyz/app/test2/libexample.so: ");
    }

    public static native void printSomething();
}

生成了Java头文件(NativeLibrary.h):

javac NativeLibrary.java
javah NativeLibrary

调用C++函数的Scala代码:

object Main extends App {
    System.load("")
    NativeLibrary.printSomething()
}

当我尝试编译此文件时,出现此错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /Users/xyz/xyz/app/test2/libexample.so: dlopen(/Users/xyz/xyz/app/test2/libexample.so, 0x0001): tried: '/Users/roohein/app/test2/libexample.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/xyz/xyz/app/test2/libexample.so' (no such file), '/Users/xyz/app/test2/libexample.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64'))
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
    at java.lang.Runtime.load0(Runtime.java:810)
    at java.lang.System.load(System.java:1088)
    at Main$.delayedEndpoint$Main$1(Main.scala:2)
    at Main$delayedInit$body.apply(Main.scala:1)
    at scala.Function0.apply$mcV$sp(Function0.scala:39)
    at scala.Function0.apply$mcV$sp$(Function0.scala:39)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    at scala.App.$anonfun$main$1(App.scala:75)
    at scala.App.$anonfun$main$1$adapted(App.scala:75)
    at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
    at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:904)
    at scala.App.main(App.scala:75)
    at scala.App.main$(App.scala:73)
    at Main$.main(Main.scala:1)
    at Main.main(Main.scala)

如果我用

System.load()
替换
System.loadlibrary()
, 即使在同一目录路径中也无法找到该库。

我也尝试了许多其他方法,例如使用 JNI 和 Java 头文件进行桥接,但我仍然遇到相同类型的错误,并且无法解决此问题。

这是我的 Java 配置:

openjdk version "1.8.0_282"
OpenJDK Runtime Environment Corretto-8.282.08.1 (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM Corretto-8.282.08.1 (build 25.282-b08, mixed mode)
java java-native-interface
1个回答
0
投票

该错误表明您的 JVM 需要架构 x86_64 的库,而您拥有配备 Apple Silicon 架构 arm64 的 Mac。

您应该调查一下从哪里获得此 JVM,并安装一个原生的 arm64。

或者,您必须使用交叉编译器(例如带有正确的

clang++
-target
)来生成现有 JVM 可以加载的 x86_64 库,但这意味着交叉编译 all 依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.