diff --git a/gandiva/src/main/java/module-info.java b/gandiva/src/main/java/module-info.java index 49deed1857..9724a97df1 100644 --- a/gandiva/src/main/java/module-info.java +++ b/gandiva/src/main/java/module-info.java @@ -26,4 +26,5 @@ requires org.apache.arrow.memory.core; requires org.apache.arrow.vector; requires org.slf4j; + requires com.sun.jna; } diff --git a/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java b/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java index 6f4cdc58c5..5c59c219ea 100644 --- a/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java +++ b/gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/JniLoader.java @@ -18,11 +18,14 @@ import static java.util.UUID.randomUUID; +import com.sun.jna.Library; +import com.sun.jna.NativeLibrary; import java.io.File; import java.io.IOException; 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; @@ -32,6 +35,9 @@ 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; private static final ConcurrentMap configurationMap = @@ -69,6 +75,9 @@ 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()); }