2013-01-04 3 views
1

Salut: Je voulais utiliser JNA pour accéder à certaines fonctions dans une bibliothèque native.Recherche de méthodes exposées dans des bibliothèques natives pour accéder à JNA/JNI?

1) Comment puis-je introspecter les fichiers de la bibliothèque native (fichiers .so, par exemple) pour voir quelles méthodes sont disponibles?

2) Y a-t-il un mappage un-un entre les méthodes accessibles dans les fichiers .so et le code C construit pour compiler ces fichiers? 3) La JNA est-elle censée fonctionner dans tous les cas où le seul interopérabilité java/native consiste à appeler des bibliothèques natives depuis Java (je suppose que c'est le cas classique de JNA) - ou est-ce que JNI est parfois nécessaire?

+0

Ah vient de trouver une partie de la réponse: la commande "nm" fera ceci est le "meilleur" des drapeaux de compilateur sont utilisés. Cependant, ce n'est pas clair quels sont les arguments. – jayunit100

+0

À moins que la bibliothèque ait été compilée avec des informations de débogage, vous ne trouverez aucune signature de méthode, seulement des noms. – technomage

Répondre

3

1) depends.exe sur les fenêtres, objdump, nm, et al. sur les variantes * nix.

2) La plupart des bibliothèques partagées sont conçues pour le couplage de style C. Cela signifie généralement que vous pouvez rechercher des adresses correspondant à des symboles dans la bibliothèque, mais le type (variable, constante ou fonction) et les informations de signature (pour les fonctions) ne sont généralement pas incorporés dans la bibliothèque. 3) JNA utilise un très petit nombre d'opérations JNI généralisées pour effectuer toute sa magie: bibliothèques partagées ouvertes, symboles de recherche, mémoire de lecture/écriture, fonctions d'appel. Il y a très peu de situations où aurait pour utiliser JNI sur JNA, au moins lorsqu'il s'agit de bibliothèques avec C linkage.

Questions connexes