You no longer need any of this. All you should need is to use (clojure.lang.RT/loadLibrary "vtk<whatever>")
That will ensure that the native libs end up in the correct classloader. On Fri, Apr 26, 2013 at 3:46 AM, Nils Blum-Oeste <nblumoe...@googlemail.com>wrote: > Great, thanks a lot. Fixed the issues I had. > However I wonder where 'wall-hack-method' lives now, as clojure-contrib > has been split. > This (old) thread suggests it has also been renamed to call-method > https://groups.google.com/forum/?fromgroups=#!topic/clojure-dev/tKzqnJWpz-k > > So is this still included in one of the clojure-contrib libraries? > > On Tuesday, June 21, 2011 11:19:44 PM UTC+2, Aaron Cohen wrote: > >> OK, I've gotten it working on my computer, and it turns out to be a >> slightly complicated problem. >> >> What is happening is that the vtk java files and your clojure code are >> using different classloaders (clojure uses its own classloader). >> >> System/loadLibrary is kind of crippled in that it always loads the >> library into the ClassLoader of the _invoking class's_ classLoader. I >> was hoping it would use the Thread's context classloader, but it does >> not. >> >> There isn't any straightforward way to load a library using a >> particular classloader either, so you have 2 options. >> >> 1) Make a java class that exposes a "loadLibrary" method. This java >> class will be in the same classLoader as VTK and as a result, >> loadLibrary calls from there will be visible to VTK. >> >> public class Loader { >> >> public static void loadLibrary(String lib) { >> // Hack to load a library outside of Clojure's classloader >> System.loadLibrary(lib); >> } >> >> } >> >> 2) Expose the package-private "Runtime/loadLibrary0" method and call it. >> >> ; This function is in clojure-contrib, reproduced here for convenience >> (defn wall-hack-method >> "Calls a private or protected method. >> params is a vector of class which correspond to the arguments to the >> method >> obj is nil for static methods, the instance object otherwise >> the method name is given as a symbol or a keyword (something Named)" >> [class-name method-name params obj & args] >> (-> class-name (.getDeclaredMethod (name method-name) (into-array >> Class params)) >> (doto (.setAccessible true)) >> (.invoke obj (into-array Object args)))) >> >> (defn load-lib [class lib] >> "Loads a native library in the same classLoader as \"class\" was >> loaded in. \"lib\" is a string with the OS-appropriate name of the >> library. For instance, to load libvtk.so on Linux, lib should be >> \"vtk\"" >> (wall-hack-method java.lang.Runtime "loadLibrary0" [Class String] >> (Runtime/getRuntime) class lib)) >> >> ; Load vtkCommonJava library in the same classLoader as vtkConeSource >> (load-lib vtkConeSource "vtkCommonJava") >> >> -------- >> >> I actually think clojure should probably add a method to its RT class >> that does option 1 above, that way there's a straightforward way to >> load native libraries in the correct classloader. >> >> --Aaron >> >> >> On Tue, Jun 21, 2011 at 4:10 PM, Antonio Recio <amdx...@gmail.com> wrote: >> > All the vtk libraries that I need are in /usr/local/lib/vtk-5.9/ and are >> > executable. >> > Java and c++ examples work fine. >> > >> > -- >> > You received this message because you are subscribed to the Google >> > Groups "Clojure" group. >> > To post to this group, send email to clo...@googlegroups.com >> >> > Note that posts from new members are moderated - please be patient with >> your >> > first post. >> > To unsubscribe from this group, send email to >> > clojure+u...@**googlegroups.com >> >> > For more options, visit this group at >> > http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >> >> -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.