Utilisez les bibliothèques statiques Windows à partir de code Java avec un minimum d'effort (de préférence avec JNA)

StackOverflow https://stackoverflow.com/questions/845016

Question

Je dois utiliser une bibliothèque de fenêtres statiques (*.lib) à partir de code java, je peux écrire des wrappers C ++ JNI, mais je préférerais ne pas le faire (contrairement à C ++).

Quelle serait la manière la plus simple (effort de développement minimal) de l'utiliser, les performances ne sont pas importantes, car ce code ne récupérera que des données, qui seront probablement traitées du côté de JAVA.

J'utiliserais probablement JNA , mais je pense qu'il a besoin de bibliothèques dynamiques, et j'ai les uns.

J'ai également posé une question sur la conversion des bibliothèques statiques en bibliothèques dynamiques.

Était-ce utile?

La solution

Pour ce que cela vaut, j’ai eu un projet comme celui-ci il ya quelque temps. Il était assez facile de générer automatiquement les wrappers JNI. Je pense que nous avons eu environ 350 exportations de fonctions à boucler. Il nous a fallu environ 3 heures pour créer un script afin de générer automatiquement l'encapsuleur (désolé, vous n'avez pas le script à portée de main, sinon je le posterais).

Nous n'avons pratiquement pas écrit de code C ++ nous-mêmes - mais cela nécessitait de comprendre le fonctionnement de JNI ... C'est en fait une très bonne opportunité d'apprentissage / projet - si vous avez le temps, n'ayez pas peur de JNI - vous serez étonné de constater à quel point vous en apprendrez sur le fonctionnement de la machine virtuelle ...

Si vous choisissez cette voie, je vous recommande de garder vos fonctions d’emballage très légères, sans aucun traitement. Il suffit de transformer les arguments nécessaires des valeurs JNI en paramètres natifs (principalement pour les chaînes), appelez votre fonction native et convertissez les résultats.

Si vous avez une fonction qui passe dans un pointeur de chaîne et s'attend à ce que la chaîne revienne dans le pointeur, utilisez un tableau de chaînes de taille 1 du côté Java et renseignez-le avec le résultat de l'appel natif.

Ou si vous êtes pressé par le temps, compilez votre .lib en un fichier .dll et utilisez JNA: -)

Autres conseils

Vous pouvez toujours créer un projet DLL (bibliothèque dynamique) qui appelle directement dans votre bibliothèque statique, puis vous pouvez utiliser JNA avec la nouvelle DLL créée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top