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());
}