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.


Reply via email to