UnsatisfiedLinkError: La procédure spécifiée n'a pas pu être trouvée
Je suis en train d'écrire quelques JNI code en C++ pour être appelée à partir d'une application sur Windows XP. J'ai réussi à exécuter l'applet et ont la JNI bibliothèque chargée et appelé, même aller aussi loin que de l'avoir appeler des fonctions dans d'autres Dll. J'ai eu ce travail par la mise en place de la variable d'environnement système PATH pour inclure le répertoire de toutes mes Dll sont dans.
Donc, le problème, c'est que j'ai ajouter un autre appel, qui utilise une nouvelle DLL externe, et du coup, lors du chargement de la bibliothèque, un UnsatisfiedLinkError est levée. Le message est: "La procédure spécifiée est introuvable". Cela ne semble pas être un problème avec un manquant DLL dépendante, parce que je peux supprimer une DLL dépendante et obtenir un message différent sur la personne à charge DLL manquant. De ce que j'ai pu trouver en ligne, il semble que ce message signifie qu'un natif Java implémentation de la fonction est manquante à partir de la DLL, mais c'est bizarre que cela fonctionne très bien sans cela d'un peu plus de code.
Personne ne sait ce qui pourrait en être la cause? Ce genre de choses peut donner une "La procédure spécifiée est introuvable" messages pour un UnsatisifedLinkError?
source d'informationauteur matt
Vous devez vous connecter pour publier un commentaire.
J'ai compris le problème. Ce fut une rude bataille. Le message "La procédure spécifiée est introuvable" pour UnsatisfiedLinkError indique qu'une fonction dans la racine dll ou dans une dll dépendante n'a pas pu être trouvé. La cause la plus probable de cette dans un JNI situation est que le natif JNI fonction n'est pas exporté correctement. Mais cela peut apparemment se passerait si une DLL dépendante est chargé et que la DLL est manquant une fonction requise par son parent.
Par exemple, nous avons une bibliothèque nommée input.dll. La DLL ordre de recherche est de toujours regarder dans le répertoire de l'application premier et le CHEMIN des répertoires dernier. Dans le passé, nous avons toujours couru exécutables à partir du même répertoire input.dll. Cependant, il est une autre input.dll dans le répertoire système de windows (qui est dans le milieu de la DLL ordre de recherche). Donc, lors de l'exécution à partir d'un applet java, si je comprend le code décrit ci-dessus dans l'applet, ce qui provoque input.dll pour être chargé, il charge le input.dll dans le répertoire système. Parce que notre code s'attend à certaines fonctions dans input.dll qui ne sont pas là (parce que c'est une autre DLL) le chargement échoue avec un message d'erreur sur les procédures. Non pas parce que la JNI fonctions sont exportées mal, mais en raison de la mauvaise DLL dépendante était chargé et il n'a pas les fonctions attendues.
Il y a une chance que la DLL a été construit à l'aide de C++(par opposition à C). sauf si vous avez pris soin de faire une extern sur la procédure,c'est une raison possible.
Tenter d'exporter toutes les fonctions de la DLL. Si la liste comprend votre fonction, vous êtes bon.
Généralement, lors de la liaison à d'autres bibliothèques, vous devez le lier à la .fichier lib. Il semble que vous n'êtes pas le référencement de tous les fichiers lib vous avez besoin. Vérifiez ce qui n'est pas de liaison et assurez-vous que vous l'ajouter lib à la liste de l'éditeur de liens.
Avez-vous de créer la nouvelle DLL externe à l'aide de la norme JNI procédure? I. e., à l'aide de javah et ainsi de suite? Si oui, alors je ne suis pas sûr de ce qui est mal.
Si non, alors la procédure que vous essayez d'appeler n'a pas été exporté (comme mentionné par anjanb). Je suis conscient de deux manière de l'exportation de fonctions: une exportation de la liste et le marquage spécifique des fonctions de __declspec(dllexport).
Ne peut pas accéder à une variable en C++ DLL à partir d'un C app a un peu plus d'informations au sujet de la Dll.
Compiler votre code c++ en mode de débogage. Ensuite, insérez le DebugBreak(); déclaration de l'endroit où vous souhaitez démarrer le débogage. Exécuter le code java. Lorsque le DebugBreak() instruction est rencontrée, vous obtiendrez une fenêtre avec un bouton de Débogage. Cliquez sur elle. Dev Studio va s'ouvrir avec votre programme en code machine. L'étape avec le débogueur deux fois et vous devriez être en mesure à l'étape au-dessus de votre code source.
Si vous avez fait toutes les émissions de la question à la JNI manuels et des exemples, mais encore vous êtes se même manquant de la procédure d'erreur, le problème peut être à votre variable path probablement. Faire les étapes ci-dessous et exécutez de nouveau:
Exemple:
À la variable d'environnement les paramètres du panneau de définir var:JAVA_HOME val:C:\Program Files\Java\jdk1.7.0_11
Après ces étapes, votre application peut trouver jni nom de la procédure et des liens vers d'JNI.dll dans le droit chemin. Donc, j'espère que vous n'obtenez pas ce manque procédure d'erreur à nouveau.