2013-06-16 4 views
1

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?

Répondre

2

Vous avez manqué que le problème ne soit pas le chargement de la bibliothèque, ce qui est l'essentiel de votre question: c'est la signature de la méthode. Il n'est pas d'accord avec ce qui est réellement dans la bibliothèque qui a été chargée. Avez-vous modifié la signature de la méthode native Java depuis que vous avez généré vos fichiers .h? Si oui, régénérez-le. Est-ce que votre fichier .h est d'accord avec votre fichier .c ou .cpp? Incluez-vous le fichier .h dans le fichier .c/.cpp? Toutes ces conditions sont requises.

+0

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

+0

Vous chargez donc une ancienne version de la bibliothèque dans le contexte Tomcat. – EJP

Questions connexes