In a Java project, I am using a third-party library that loads some native library via
I'd like to be able to influence the search path of this method from within my application, so that the user doesn't need to specify a correct java.library.path value on the command line (this value depends on the current OS and architecture). E.g on Windows I want to set it to "lib/native/windows", on Linux 32bit to "lib/native/linux32" etc.
but this is ignored, apparently because the JVM reads this property only once before my code is run.
I also tried to load the native libray before using the Java library that depends on it with
This call succeeds, but there will still be an UnsatisfiedLinkError when the native library is loaded again with System.loadLibrary().
The only way I found is the following:
This works, but I find it very complicated and it is much effort because I need to add all those interfaces. Is there a simpler way?
Base on your comments above (particularly, the behaviour of the 3rd-party library), I'd say that your best option is to get the library path right when you launch the JVM.
I needed to change the dll path for my unit tests. I tried the following hack and it worked:
System.setProperty( "java.library.path", "/path/to/libs" ); Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" ); fieldSysPath.setAccessible( true ); fieldSysPath.set( null, null );
For explanation, see the original link.
I tried to following to load a native Growl library for a Java application on my Mac where the lib is in the root of the classpath of my application:
Is there a simpler way?
Yes, provide batch/script files to start the application. Then you can set the correct path in the batch/shell file or even read the value from an environment variable. Much easier then trying to do it from inside the application.