diff --git a/java/gandiva/pom.xml b/java/gandiva/pom.xml index c5703c62dfe2..f100044646c0 100644 --- a/java/gandiva/pom.xml +++ b/java/gandiva/pom.xml @@ -26,6 +26,7 @@ true ../../../cpp/release-build + 5.14.0 @@ -59,6 +60,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 57748e9c8e1a..4f784b2e6321 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,18 +24,25 @@ 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; private static final ConcurrentMap configurationMap @@ -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()); }