diff --git a/java/gandiva/pom.xml b/java/gandiva/pom.xml index d7a36ed7d282c..1ce87830d4bf8 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 @@ -62,6 +63,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 2528989f3784b..25d6f7a01dfcd 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 = 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()); }