J'ai besoin de charger une bibliothèque native dans Tomcat qui sera utilisée par les applications web. J'ai créé une classe wrapper qui appelle System.load ("path/to/bibliothèque") comme décrit dans: http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_TomcatBibliothèque native partagée dans Tomcat UnsatisfiedLinkError
Ma définition de la classe est similaire à celle du lien:
public class FooWrapper {
public native void doFoo();
}
Je peux appeler doFoo() à partir d'une application autonome (ce qui signifie que la méthode native Java_packagename_FooWrapper_doFoo (...) écrite en C est exportée correctement). Cependant, quand je l'appelle la méthode doFoo à partir d'une application web je reçois:
java.lang.UnsatisfiedLinkError: packagename.FooWrapper.doFoo()V
Je suis en mesure d'obtenir une liste des bibliothèques natives chargées par le ClassLoader en utilisant l'astuce décrite ici: How do I get a list of JNI libraries which are loaded?
java.lang.reflect.Field loadedLibraries = ClassLoader.class.getDeclaredField("loadedLibraryNames");
loadedLibraries.setAccessible(true);
final Vector<String> libraries = (Vector<String>) loadedLibraries.get(ClassLoader.getSystemClassLoader());
et ma bibliothèque native est répertoriée dans le vecteur de bibliothèque, par conséquent le bloc statique qui appelle System.load (...) est exécuté sans aucune exception. Cependant, il semble que Java ne trouve pas de fonction appropriée dans la bibliothèque native lorsque j'appelle doFoo() depuis une application Web. Qu'est-ce que je rate?
Bonjour EJP, merci pour votre réponse, je ne me suis pas concentré sur la signature de la méthode parce que comme je l'ai dit, ça fonctionne très bien dans une application autonome (par exemple, charger une librairie aucun problème). J'ai généré les en-têtes avec l'outil javah et j'implémente des méthodes. La bibliothèque native est compilée correctement. L'erreur UnsatisfiedLinkError n'apparaît que dans le contexte de Tomcat. – Mihai
Vous chargez donc une ancienne version de la bibliothèque dans le contexte Tomcat. – EJP