How to add .so file to the java.library.path in Linux

Linuxjava.library.path

Linux Problem Overview


I am working with a java application which needs a .dll file in java.library.path in windows. To run same application in Linux I have the respective .so file which should be added to java.library.path in linux machine, I didnt find any easy solution for this so far

I did put the .so in a folder which is already in the class path, but my application still complains there is no required .so file in java.library.path

I'd like to find:

  1. Ways to add .so to java.library.path
  2. How to know if its already added (when added)

Linux Solutions


Solution 1 - Linux

Add the containing directory to LD_LIBRARY_PATH before launching the application

        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/pathOfContainingDirectory

Use java -XshowSettings:properties to show the java.library.path (and others) value.

Solution 2 - Linux

I had a lot of trouble figuring this out, please make sure that you have lib prefix in the library name.

So steps,

  1. export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/some/pathOfContainingDirectory"

  2. Rename libraries to have lib as a prefix. [Add this as part of build script]

     mv JNIDemo.so libJNIDemo.so
    

Check this answer for detailed explanation https://stackoverflow.com/a/3987567/2076566

Solution 3 - Linux

I used java -XshowSettings:properties method and found the path of a previously set folder and copied my so file to that folder

Solution 4 - Linux

I believe this to be a better way to do it as it only needs one single link to be created, no file edits needed, no exports or running of source before an application is run. And no bashrc lines needed.

That said, if you upgrade it may cause unintentional errors to future java releases as it might load an outdated library, although one link removal also solves this.

This works under ubuntu 18.04 with java 11 opensdk installed.

$ locate libjawt.so
$ java -XshowSettings:properties

From the two commands above, you can find the two paths you need to adjust this to your own system.

sudo ln -s /path/from/locate/libjawt.so /path/from/properties/libawt.so

I made a symlink for java ll open sdk to find the library and mine was as follows because /usr/lib is one of the paths in the output. There is (in my output) a java path you may choose to use instead of /usr/lib if you want to keep java library (even symlinks) together.

sudo ln -s /usr/lib/jvm/java-11-openjdk-amd64/lib/libjawt.so /usr/lib/libjawt.so

Solution 5 - Linux

File file = null;
private String[] libs_path = System.getProperty("java.library.path").split(":");
public boolean isInstalled() {
	boolean isInstalled = false;
	for(String lib : libs_path) {
			file = new File(lib+"/"+"yourlib.so");
			if(file.exists()) {
				isInstalled = true;
				break;
			}
		}
	return isInstalled;
}


public void install() {
    if(!isInstalled) {
        for(String lib: lib_path) {
             // copy your .so to lib
             break;
        }
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLihkinisakView Question on Stackoverflow
Solution 1 - LinuxJose Luis MartinView Answer on Stackoverflow
Solution 2 - LinuxteardropView Answer on Stackoverflow
Solution 3 - LinuxRavinduView Answer on Stackoverflow
Solution 4 - LinuxCodingInTheUKView Answer on Stackoverflow
Solution 5 - LinuxArdika Rommy SanjayaView Answer on Stackoverflow