2010-10-29 4 views
1

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!

Répondre

2

Essayez d'exporter votre fonction C++ as a C function:

extern "C" JNIEXPORT jboolean JNICALL Java_Foo_bar (...) 

Cela désactive le nom mutiler.

Édition: ce n'est en effet pas mangling, mais "décoration", qui est apparemment toujours fait pour la convention __stdcall que JNI utilise. L'ajout d'un fichier .def ou d'un argument de l'éditeur de liens /export semble être le solution.

+0

Il y a un "C" externe dans la déclaration de fonction - en ai-je besoin aussi sur la définition? – eab

+0

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

+0

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"). –

Questions connexes