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 <[email protected]> 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 [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en