Il est difficile de répondre à une question aussi générique. Je suppose que la différence la plus évidente est qu'avec JNI, la conversion de type est implémentée du côté natif de la frontière Java/natif, alors qu'avec JNA, la conversion de type est implémentée en Java. Si vous êtes déjà à l'aise avec la programmation en C et que vous devez implémenter vous-même du code natif, je suppose que JNI ne vous semblera pas trop complexe. Si vous êtes un programmeur Java et que vous avez seulement besoin d'invoquer une bibliothèque native tierce, l'utilisation de JNA est probablement la voie la plus facile pour éviter les problèmes peut-être pas si évidents de JNI.
Bien que je n'aie jamais évalué les différences, je suppose, du fait de la conception, que la conversion de type avec JNA sera, dans certaines situations, moins performante qu'avec JNI. Par exemple, lors du passage de tableaux, JNA les convertira de Java en natif au début de chaque appel de fonction et inversement à la fin de l'appel de fonction. Avec JNI, vous pouvez contrôler vous-même le moment où une "vue" native du tableau est générée, en ne créant potentiellement qu'une vue d'une partie du tableau, en conservant la vue sur plusieurs appels de fonction et, à la fin, en libérant la vue et en décidant si vous voulez conserver les changements (ce qui peut nécessiter de recopier les données) ou rejeter les changements (aucune copie nécessaire). Je sais que vous pouvez utiliser un tableau natif à travers des appels de fonction avec JNA en utilisant la classe Memory, mais cela nécessitera également une copie de la mémoire, ce qui peut être inutile avec JNI. La différence peut ne pas être pertinente, mais si votre objectif initial est d'augmenter les performances de l'application en implémentant des parties de celle-ci en code natif, l'utilisation d'une technologie de pont moins performante ne semble pas être le choix le plus évident.
0 votes
Un facteur important pour lequel nous avons choisi JNA plutôt que JNI, est que JNA ne nécessite aucune modification de nos bibliothèques natives. Le fait de devoir personnaliser les bibliothèques natives juste pour pouvoir travailler avec Java était un grand NON pour nous.