How to add .so file to the java.library.path in 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.


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


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


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