2009-05-10 9 views
3

Je dois utiliser une bibliothèque de fenêtres statiques (*.lib) à partir du code java, je peux écrire des wrappers JNI C++, mais je préfère ne pas le faire (pas cela a vécu en C++). Ce qui serait le moyen le plus facile (effort de développement le moins), la performance n'est pas importante, car ce code ira chercher quelques données, qui seront probablement travaillées sur le côté JAVA.Utiliser les bibliothèques statiques Windows à partir du code Java avec un minimum d'effort (de préférence avec JNA)

Très probablement, j'utiliserais JNA, mais je pense qu'il a besoin de bibliothèques dynamiques, et j'ai des bibliothèques statiques.

J'ai également asked questio sur la conversion de bibliothèques statiques en bibliothèques dynamiques.

Répondre

2

Pour ce que ça vaut, j'ai eu un projet comme ça il y a quelque temps. Il était assez facile de générer automatiquement les wrappers JNI. Je pense que nous avions environ 350 exportations de fonctions à emballer. Il nous a fallu environ 3 heures pour mettre en place un script pour générer automatiquement le wrapper (désolé, ne pas avoir le script à portée de main ou je le posterais).

Nous n'avons presque pas écrit de code C++, mais cela nécessitait de comprendre comment JNI fonctionne ... C'est en fait une très bonne opportunité/projet d'apprentissage - si vous avez le temps, n'ayez pas peur de JNI - vous aurez être étonné de voir combien vous en apprenez sur le fonctionnement de la JVM ...

Si vous suivez cette voie, je vous recommande de garder vos fonctions wrapper vraiment, vraiment légères - littéralement, pas de traitement du tout. Transformez simplement les arguments nécessaires des valeurs JNI en natif (cela est généralement nécessaire 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 attend que la chaîne revienne dans le pointeur, utilisez un tableau de chaînes de taille 1 du côté Java et remplissez-le avec le résultat de l'appel natif.

Ou si vous êtes pressé, compiler votre .lib à un .dll et utiliser :-) JNA

3

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.

+1

Oui je pouvais, mais je préfère de beaucoup appeler l'ensemble des choses directrly de java. . . Cela me permettrait d'expérimenter plus vite. La bibliothèque que j'utilise est un gâchis que des centaines de fonctions, donc écrire une enveloppe complète n'est pas une option, et le faire petit à petit sera aussi une douleur. –

+1

Je ne suggère pas le JNI, donc il n'y a pas besoin d'écrire des choses complexes dans le wrapper. En fait, il est facile - préfixe _declspec (dllexport) pour chaque fonction dans l'en-tête (qui peut être simplement fait par search-replace de l'éditeur) et construire comme un projet DLL, alors il devrait vous donner une DLL. – Francis

+0

Je vais essayer, merci. –

Questions connexes