C'est la première fois que j'utilise JNI. J'ai besoin d'appeler une bibliothèque Visual C++ tierce à partir d'un programme Java, j'ai donc écrit un wrapper dans Visual C++. La bibliothèque se charge bien, mais quand j'essaye d'appeler une fonction de ma bibliothèque de wrapper, je reçois le redouté UnsatisfiedLinkError.Application Java capable de charger la bibliothèque mais ne peut pas trouver la fonction (visuel C++ name mangling?)
Mon emballage comprend le fichier .h créé par javah, et a ce qui suit dans le fichier .cpp:
jboolean JNIEXPORT JNICALL Java_Foo_bar (...)
mais les spectacles de bibliothèque (dans PE Explorer) _Java_Foo_bar @ 32
et mon code Java a
native publique bar booléenne (...) à l'intérieur de classe Foo
Je soupçonne que le @ 32 est ce qui déclenche Java, mais je ne peux pas comprendre comment s'en débarrasser. Je ne sais pas grand-chose sur les paramètres du compilateur/éditeur de liens et autres - j'ai pour la plupart réussi à éviter les valeurs par défaut, ou j'ai demandé à quelqu'un d'autre de gérer cette partie d'un projet.
Merci d'avance pour toute aide!
Il y a un "C" externe dans la déclaration de fonction - en ai-je besoin aussi sur la définition? – eab
J'ai ajouté un "C" externe à la définition et je vois toujours la même chose dans le fichier .dll - y at-il un autre commutateur ou quelque chose que j'ai besoin d'utiliser? Je pense que le @ 32 est en fait appelé une «décoration», pas mangling. – eab
Si j'interprète la norme correctement, pas si la fonction est déclarée avant qu'elle ne soit définie (par exemple, le module la définissant inclut un en-tête qui la déclare avec une liaison "C"). –