首页 > 解决方案 > JavaNativeFoundation.framework 在 Azul 和 Liberica JDK 中没有主要版本——我怎么能告诉 Java 使用它呢?

问题描述

我正在尝试在基于 ARM 的 Mac 上使用本机库,即 M1 处理器。该架构有几个可用的 JVM,例如 Azul 或 Liberica。两者都带有一个JavaNativeFoundation.framework动态库,这是使用任何 JNI 代码所必需的。但是,框架没有Versions包含框架主要版本的文件夹(如A)。相反,该库仅包含在顶级文件夹中:

/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/JavaNativeFoundation.framework
/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/JavaNativeFoundation.framework/_CodeSignature
/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/JavaNativeFoundation.framework/_CodeSignature/CodeResources
/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/JavaNativeFoundation.framework/JavaNativeFoundation
/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/JavaNativeFoundation.framework/Resources
/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/JavaNativeFoundation.framework/Resources/Info.plist

试图运行我得到的程序

[java] AquaNativeSupport: Unable to load library libvaqua.dylib: /private/var/folders/tg/06858t0j3w10js_5hb3k5frw0000gn/T/libvaqua4883847212092667097.dylib: dlopen(/private/var/folders/tg/06858t0j3w10js_5hb3k5frw0000gn/T/libvaqua4883847212092667097.dylib, 0x0001): Library not loaded: @rpath/JavaNativeFoundation.framework/Versions/A/JavaNativeFoundation
[java]   Referenced from: /private/var/folders/tg/06858t0j3w10js_5hb3k5frw0000gn/T/libvaqua4883847212092667097.dylib
[java]   Reason: tried: '/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/server/./JavaNativeFoundation.framework/Versions/A/JavaNativeFoundation' (no such file),
 '/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/lib/server/../JavaNativeFoundation.framework/Versions/A/JavaNativeFoundation' (no such file),
 '/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/bin/./JavaNativeFoundation.framework/Versions/A/JavaNativeFoundation' (no such file),
 '/Library/Java/JavaVirtualMachines/zulu-16.jdk/Contents/Home/bin/../lib/JavaNativeFoundation.framework/Versions/A/Java

看起来输出不完整,但无论如何:您可以看到 java 正在尝试从框架的Versions/A/子文件夹加载框架,该子文件夹在任何地方都不存在。

如果我创建那个子文件夹并创建一个指向其中现有二进制文件的软链接JavaNativeFoundation,那么应用程序就可以很好地加载 JNI 代码。

鉴于这种情况,我有两个问题:

  1. 为什么 Azul/zulu 和 Liberica 中的框架都缺少版本结构?
  2. 有没有办法通过以不同的方式加载框架来解决这个问题?一些“dontusemajorversion”标志?

谢谢您的帮助。

标签: javamacosarm64apple-m1azul-zulu

解决方案


推荐阅读