Packaging Change for macOS

The build scripts and binary distributions of macOS-specific packages (VAppearances, Java Native Rendering, and VAqua) have been changed to create and use universal binaries. Universal binaries are native libraries that contain compiled code for both Intel and Apple Silicon (x86_64 and arm64) architectures. This change does not affect application code that uses these packages, but it does change how the packages are built and how applications that use the packages are built.

Like most native libraries called from Java on macOS, the above packages use a macOS system framework called JavaNativeFoundation. This framework is not available to code running natively on Apple Silicon; instead, an unbundled open source version of JavaNativeFoundation must be used. To accomodate this change, the binary distributions of the above packages have been changed to use a relative path to access the JavaNativeFoundation framework. Using a relative path means that an application that uses these packages must specify a path to locate the framework.

For a bundled macOS application, the path can be specified as an environment variable in the application Info.plist.

For example:

  <key>LSEnvironment</key>
  <dict>
    <key>DYLD_FRAMEWORK_PATH</key>
    <string>../Frameworks:/System/Library/Frameworks:/System/Library/Frameworks/JavaVM.framework/Frameworks</string>
  </dict>

This particular specification looks first in the Frameworks directory of the application before looking for a system framework (the third path is needed on older macOS releases). It means that the unbundled JavaNativeFoundation framework will be found if at some point it is bundled with the application. Bundling the framework is not required, but it will be necessary to support native execution of an application on Apple Silicon systems.

Additional information on relative paths can be found by searching for rpath macos.