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<javascript:>> 
> 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<javascript:>
> > 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 <javascript:>
> > 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 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.


Reply via email to