diff --git a/java/gandiva/pom.xml b/java/gandiva/pom.xml index ef58aca06d878..24c33fb16d498 100644 --- a/java/gandiva/pom.xml +++ b/java/gandiva/pom.xml @@ -26,6 +26,7 @@ 1.8 1.8 3.25.1 + 5.14.0 true ../../../cpp/release-build @@ -66,6 +67,11 @@ org.slf4j slf4j-api + + net.java.dev.jna + jna + ${jna.version} + diff --git a/java/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java b/java/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java index 57748e9c8e1af..a956b9e7981e1 100644 --- a/java/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java +++ b/java/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java @@ -24,17 +24,24 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.Collections; import java.util.Locale; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.arrow.gandiva.exceptions.GandivaException; +import com.sun.jna.Library; +import com.sun.jna.NativeLibrary; + /** * This class handles loading of the jni library, and acts as a bridge for the native functions. */ class JniLoader { private static final String LIBRARY_NAME = "gandiva_jni"; + + private static final int RTLD_GLOBAL = 0x00100; + private static final int RTLD_LAZY = 0x00001; private static volatile JniLoader INSTANCE; private static volatile long defaultConfiguration = 0L; @@ -73,6 +80,10 @@ private static void loadGandivaLibraryFromJar(final String tmpDir) final String libraryToLoad = LIBRARY_NAME + "/" + getNormalizedArch() + "/" + System.mapLibraryName(LIBRARY_NAME); final File libraryFile = moveFileFromJarToTemp(tmpDir, libraryToLoad, LIBRARY_NAME); + NativeLibrary.getInstance( + libraryFile.getAbsolutePath(), + Collections.singletonMap(Library.OPTION_OPEN_FLAGS, new Integer(RTLD_LAZY | RTLD_GLOBAL)) + ); System.load(libraryFile.getAbsolutePath()); }