~ Using Java LMDB on Apple Sillicon or other unsupported platforms
» By Joren on Wednesday 25 May 2022LMDB is a fast key value store, ideal to store and query sorted data with small keys and values. LMDB is a pure C library but often used from other programming languages via some type of bindings. These bindings are ‘bridges’ between languages and are automatically present on supported platform. On new or unsupported platforms, however, you need to build a this bridge yourself.
This blog post is about getting java-lmdb working on such unsupported platform: arm64. The arm64 platform is much more popular since the introduction of the Apple silicon – M1 platform. On Apple M1 the default architecture of Docker images is also aarch64.
The java-lmdb project uses JNR-FFI in the background. This is only one of the many ways to bridge Java and other programming languages. The new version of JNR-FFI supports the arm64. Currently, only the ‘SNAPSHOT’ version of java-lmdb uses this version. So the dependencies need to be changed to e.g. (when using Gradle):
repositories { mavenCentral() maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } dependencies { implementation group: 'org.lmdbjava', name: 'lmdbjava', version: '0.8.3-SNAPSHOT' }
Next you need to build the lmdb
library for your platform and copy it to a location where Java looks for it. This only works when compilers are already available on your system. In macOS you might need to install the XCode command line tools:
#xcode-select --install git clone --depth 1 https://git.openldap.org/openldap/openldap.git cd openldap/libraries/liblmdb make -e SOEXT=.dylib cp liblmdb.dylib ~/Library/Java/Extensions
On Debian aarch64
the procedure is similar but a different extension is used (.so
):
#apt install build-essential git clone --depth 1 https://git.openldap.org/openldap/openldap.git cd openldap/libraries/liblmdb make mv liblmdb.so /lib
Finally, to use the library in a JAR-file is might be needed to allow lmdbjava
to access some parts of the JRE:
java -jar your_jar.jar --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED
A very similar setup was needed for the docker version of Panako.