title: How to influence search path of System.loadLibrary() through Java code?
body: <p>In a Java project, I am using a third-party library that loads some native library via</p>
  
  <pre><code>System.loadLibrary("libName");
  </code></pre>
  
  <p>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.</p>
  
  <p>I tried</p>
  
  <pre><code>System.setProperty("java.library.path", ...)
  </code></pre>
  
  <p>but this is ignored, apparently because the JVM reads this property only once before my code is run.</p>
  
  <p>I also tried to load the native libray before using the Java library that depends on it with</p>
  
  <pre><code>System.load("fullPath/lib")
  </code></pre>
  
  <p>This call succeeds, but there will still be an UnsatisfiedLinkError when the native library is loaded again with System.loadLibrary().</p>
  
  <p>The only way I found is the following:</p>
  
  <ul>
  <li>Add interfaces that abstract the whole API of the external library.</li>
  <li>Use only these interfaces in the rest of the code.</li>
  <li>Add classes that implement the interfaces and delegate to the library.</li>
  <li>Write an own ClassLoader, that 
  <ul>
  <li>overwrites findLibary() so that the native library is found in the correct path</li>
  <li>overwrites loadClass() and loads all classes of the external library and the wrapper layer by itself instead of trying to delegate to its parent like the default ClassLoader would do</li>
  </ul></li>
  <li>Ensure that the interfaces are loaded with the normal ClassLoader and the wrapping classes and the external library are loaded with my own ClassLoader.</li>
  </ul>
  
  <p>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?</p>