我尝试从 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)
该错误表明您的 JVM 需要架构 x86_64 的库,而您拥有配备 Apple Silicon 架构 arm64 的 Mac。
您应该调查一下从哪里获得此 JVM,并安装一个原生的 arm64。
或者,您必须使用交叉编译器(例如带有正确的
clang++
的 -target
)来生成现有 JVM 可以加载的 x86_64 库,但这意味着交叉编译 all 依赖项。